トップ回答者
TreeViewコントロールのAfterLabelEditイベント内でノードを追加した場合の挙動

質問
-
いつもお世話になっております。
VS2005のC#環境でアプリケーションを作成しているのですが
TreeViewコントロールのAfterLabelEditイベント内で、
入力されたラベル名によって、ノードの構成を編集する作業を行いたいのですが
AfterLabelEdit内でノードを追加すると、BeforeLabelEdit、AfterLabelEditイベントが発生し困っております。
質問としては
1、 フォームのコンストラクタやボタンコントロールからノードを追加しても
BeforeLabelEdit、AfterLabelEditが発生しないのに
AfterLabelEdit内でノードを追加すると、何故、BeforeLabelEdit、AfterLabelEditが発生するのでしょうか?
2、ラベル編集後に行うべきノードの再構築処理がAfterLabelEditで出来ない場合、代替案はあるのでしょうか?
お知恵を拝借できますでしょうか?- 編集済み zilch_1975 2009年11月11日 15:51
回答
-
ノードの追加処理を、Control.BeginInvoke を使って後回しにするというのはどうでしょう?
- 回答としてマーク zilch_1975 2009年11月12日 15:49
すべての返信
-
ノードの追加処理を、Control.BeginInvoke を使って後回しにするというのはどうでしょう?
- 回答としてマーク zilch_1975 2009年11月12日 15:49
-
-
Control.BeginInvoke はスレッドとは直接関係ありませんが(必ず UI スレッドで実行されるので別スレッドからの操作に使用されるのが一般的とはいえ)、AfterLabelEdit から BeginInvoke で指定したデリゲートが実行されるまでに、マウスクリックで編集完了した場合の MouseDown が割り込むぐらいはいかんともしがたいところですね。
でしたら、新しく追加する TreeNode の Tag プロパティなどに「AfterLabelEdit から追加したノードだぜ」フラグでも持たすというのはどうでしょうか。
そして BeforeLabelEdit イベントで、対象の TreeNode の Tag を確認して、AfterLabelEdit で追加直後のノードかどうかを確認し、もしそうであればエディットをキャンセルすると。
万が一 AfterLabelEdit での追加後に編集状態にならなかった場合のことを考えて、フラグには時刻を使用し、n ミリ秒以上経過していればフラグが立ってても無視、キャンセルしない、という風に実装すればより安全ですね。 -
Hongliangさん
Control.BeginInvokeでAfterLabelEdit後のノードへの編集が出来ました。
AfterLabelEdit内でControl.BeginInvokeでノードの編集処理をdelegateで処理するようにしました。
特に終了検出はしていませんが旨く行きました。
有難う御座いました。
しかし、
フォームのコンストラクタやボタンコントロールからノードを追加してもBeforeLabelEdit、AfterLabelEditが発生しないのに
AfterLabelEdit内でノードを追加すると、BeforeLabelEdit、AfterLabelEditが発生する原因は未だに理解出来ておりません。