none
TreeViewコントロールのAfterLabelEditイベント内でノードを追加した場合の挙動 RRS feed

  • 質問

  • いつもお世話になっております。

    VS2005のC#環境でアプリケーションを作成しているのですが
    TreeViewコントロールのAfterLabelEditイベント内で、
    入力されたラベル名によって、ノードの構成を編集する作業を行いたいのですが
    AfterLabelEdit内でノードを追加すると、BeforeLabelEdit、AfterLabelEditイベントが発生し困っております。

    質問としては

    1、 フォームのコンストラクタやボタンコントロールからノードを追加しても
       BeforeLabelEdit、AfterLabelEditが発生しないのに
      AfterLabelEdit内でノードを追加すると、何故、BeforeLabelEdit、AfterLabelEditが発生するのでしょうか?

    2、ラベル編集後に行うべきノードの再構築処理がAfterLabelEditで出来ない場合、代替案はあるのでしょうか?


    お知恵を拝借できますでしょうか?

     

    2009年11月11日 11:07

回答

すべての返信

  • ノードの追加処理を、Control.BeginInvoke を使って後回しにするというのはどうでしょう?
    • 回答としてマーク zilch_1975 2009年11月12日 15:49
    2009年11月11日 11:41
  • Hongliangさん
     スレッドの知識が乏しいので頓珍漢な事を言ってるかも知れませんが
     AfterLabelEdit終了直後にControl.BeginInvokeを使ってスレッドでデリゲートを非同期に実行すると言う事でしょうか?
     AfterLabelEdit終了直後に行う処理は非同期に動かれると困るのですが(必ず完了してからGUI操作を受け付けたい)
     以下のように終了検出をAfterLabelEditで行っても良いのでしょうか?

    AfterLabelEdit()
    {
     // リネーム
     // スレッド生成
     // スレッド処理完了待ち
    }

    2009年11月12日 6:03
  • Control.BeginInvoke はスレッドとは直接関係ありませんが(必ず UI スレッドで実行されるので別スレッドからの操作に使用されるのが一般的とはいえ)、AfterLabelEdit から BeginInvoke で指定したデリゲートが実行されるまでに、マウスクリックで編集完了した場合の MouseDown が割り込むぐらいはいかんともしがたいところですね。
    でしたら、新しく追加する TreeNode の Tag プロパティなどに「AfterLabelEdit から追加したノードだぜ」フラグでも持たすというのはどうでしょうか。
    そして BeforeLabelEdit イベントで、対象の TreeNode の Tag を確認して、AfterLabelEdit で追加直後のノードかどうかを確認し、もしそうであればエディットをキャンセルすると。
    万が一 AfterLabelEdit での追加後に編集状態にならなかった場合のことを考えて、フラグには時刻を使用し、n ミリ秒以上経過していればフラグが立ってても無視、キャンセルしない、という風に実装すればより安全ですね。
    2009年11月12日 6:59
  • Hongliangさん

    Control.BeginInvokeでAfterLabelEdit後のノードへの編集が出来ました。
    AfterLabelEdit内でControl.BeginInvokeでノードの編集処理をdelegateで処理するようにしました。
    特に終了検出はしていませんが旨く行きました。
    有難う御座いました。


    しかし、
    フォームのコンストラクタやボタンコントロールからノードを追加してもBeforeLabelEdit、AfterLabelEditが発生しないのに
    AfterLabelEdit内でノードを追加すると、BeforeLabelEdit、AfterLabelEditが発生する原因は未だに理解出来ておりません。


    2009年11月12日 15:49