何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 36185
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

Product Feedback Center に提出したバグレポートのひとつが、「仕様」として close しました。しかし、納得できない。

ListChanged イベントが複数回発生する

添付の windowsapplication1.zip を、VS2005 で実行します。BindingNavigator にある「追加」ボタンでアイテムを連続して追加すると、2つ目以降のアイテム追加で、ListChanged イベントが2回発生します。しかし、「追加」のあとにフォーカス移動をすると、次の追加では1度しか発生しません。

これについての回答が、11月30日(アメリカ時間)にあります。

追加を行うときに bindingSource が2つのことを行う。1つが「前回のアイテムの追加を終了する処理」で、もう1つが「新しいアイテムを追加する処理」。このため、リストが2回変わり、ListChanged イベントが2回発生する。

しかし、この回答では「アイテムを追加後、フォーカスを移動したときには1度しか発生しない」ことについて触れられていません。当然、「じゃぁ、アイテムを追加して、フォーカスを移動したときは、追加終了処理は行われないのか」という疑問がわいてきます。

日本語から英語に翻訳されるときに情報が欠落したのかもしれませんが、こういうところでマイクロソフト開発陣の「バグ認識能力」に疑問を感じます。

投稿日時 : 2005年12月9日 4:55
コメント
  • # re: 納得できん
    NyaRuRu
    Posted @ 2005/12/11 1:09
    データバインディング関係はこれ読むまで使ったことが無かったので,間違っていたとしたら申し訳ありませんが……

    >Actual Results: 連続して追加をすると、ListChanged イベントが2回発生する。
    >Expected Results: 連続して追加しても、ListChanged イベントは1回しか発生しない。

    これって仕様通りなんでは?

    http://msdn2.microsoft.com/en-us/library/system.componentmodel.ibindinglist.addnew.aspx

    When this method is called, you should raise a ListChanged event with the ItemAdded enumeration carrying the appropriate index. The added row is in a state where hitting Esc on a DataGridView control can remove the new row. Raising the ListChanged event with the ItemAdded enumeration a second time on this row indicates that the item is now a normal row (not in new state).

    とりあえず「こうなるべき」の根拠は書かれた方がいいのではないでしょうか.何か深遠な理由で変更されるべきなのか,それとも単にそんな気がしただけなのかが伝わらないと向こうも判断に困るでしょうし.

    あと,サンプルコードをちらっと見てみた感じ ListChanged や PositionChanged で内部状態を切り替えているようですね.

    this.bindingSource1.Position = 2;
    this.bindingSource1.AddNew();

    のようなコードを直接実行すれば,「フォーカスが移動すれば」とか,「[+]クリック」とかの GUI 操作を指定しなくても,単純にプログラムを実行するだけで「Jitta さんの言うところの問題のある挙動」を再現できるようです.
  • # re: 納得できん
    Jitta
    Posted @ 2005/12/11 21:20
    コメントありがとうございます。

     う~ん、1.0 の時から、ですね。そういえば、読んだことがあるような気がする。

    この行で ItemAdded 列挙体を使用して 2 回目に ListChanged イベントを発生させると、その項目が (new 状態ではなく) 通常の行になったことが示されます。

    「2回目に発生させるとって、どうやって発生させるんだ?」って考えたような気がする。


     仕様なら仕様で、いいんです。なぜそうなのか、がわかると、「どうあって欲しい」も変わるのではないでしょうか。

    この行で ItemAdded 列挙体を使用して 2 回目に ListChanged イベントを発生させると、その項目が (new 状態ではなく) 通常の行になったことが示されます。

    ということなのですが、1回目の発生は前回の AddNew にの続きで、「通常の行になった(item is now a normal row (not in new state))」ことを示すイベントだと言うわけですね。
     であれば、何らかの操作をしたときには、このイベントが通知されない、ということですよね。それは、問題ではないのでしょうか、ということです。
     「何らかの操作により、2回目のイベントが発生しないことがある」と言うことが、リファレンスには書かれておらず、提起した問題に対する回答にも書かれていません。

     なお、このブログエントリの目的は、「バグじゃないの?」ということではなく、「バグの認識の仕方(または説明の仕方)が甘いんじゃないの?」ということです。
    > しかし、この回答では「アイテムを追加後、フォーカスを移動したときには1度しか発生しない」ことについて触れられていません。
    > 当然、「じゃぁ、アイテムを追加して、フォーカスを移動したときは、追加終了処理は行われないのか」という疑問がわいてきます。
  • # re: 納得できん
    Jitta
    Posted @ 2005/12/11 21:21
    邪魔が入ったので、しきりれとんぼです
  • # 恥ず
    何となく Blog by Jitta
    Posted @ 2005/12/13 6:26
    恥ず
  • # re: 納得できん
    Jitta
    Posted @ 2005/12/13 6:27
    > なお、このブログエントリの目的は
    「目的」じゃなく、「趣旨」でした。


     私は、「こうやれば2回、こうやれば1回、イベントが上がる。1回であるべきでは?」と提出しています。「2回上がるのは仕様だ」というのは、いいです。というか、リファレンスに書いてあることを確認していなかった私のミスですし、仕様として納得します。納得できないのはそこではなく、
    「なぜ、『じゃぁ1回しか上がらないのは、バグなのか仕様なのか』まで踏み込まないのか」
    という所です。
     その辺りのことを、フィードバックの方には、

    BindingSource が、ユーザのアイテム追加指示で2つのことを行う、ということは理解できました。
    しかし、そうだとしたら、フォーカスが移動したときには1度しか発生しないのは、なぜでしょうか。
    または、フォーカスが移動したときにイベントが発生しないのはなぜでしょうか。

    (略)
    の後に、フォーカス移動の操作を行った場合、
    なぜ ListChanged イベントは1度しか発生しないのでしょうか。
    私は、フォーカス移動時に発生しなければならないのでは、と思います。
    または、ITEM1 の追加終了処理は、いつ行われるのでしょうか。

    と、書いています。ブログの方では、

    しかし、この回答では「アイテムを追加後、フォーカスを移動したときには1度しか発生しない」ことについて触れられていません。当然、「じゃぁ、アイテムを追加して、フォーカスを移動したときは、追加終了処理は行われないのか」という疑問がわいてきます。

    と、書いています。


     このエントリの趣旨は、理解して頂けたでしょうか。
  • # re: 納得できん
    NyaRuRu
    Posted @ 2005/12/13 15:51
    ところで現在の本題であるところの,

    >当然、「じゃぁ、アイテムを追加して、フォーカスを移動したときは、追加終了処理は行われないのか」という疑問

    については解決されましたか?
    ちょっと調べてみたところ GDNJ のこのスレッドがみつかりました.

    http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=21988

    実際には他のイベントも併用することで状態のトラックを行っているようです.
    ご参考までに.
  • # ListChanged イベント
    Jitta
    Posted @ 2005/12/13 19:38
    混乱してきたので、eXconn で、他の MVP な方々のご意見を伺ってみようかと、質問を投げています。

    結果はこちらか、記事としてフィードバックします。


    わざわざ探していただき、ありがとうございます。
  • # re: 納得できん
    Jitta
    Posted @ 2005/12/26 19:40
    DataSource に指定するモノを DataTable にすると、「フォーカス移動」でも ListChanged が発生しました。このことや、リファレンスに書いてあることを考えると、DataSource が変更を通知する必要があるようです。
タイトル
名前
Url
コメント