長いタイトルですが、そのまんまの記事です。
これはBeforeSelectイベントとAfterSelectイベントを補足して新しくTreeNodeが選択されようとしているときにこれまで選択されていたTreeNodeのTagプロパティにテキストデータを保存して、新しくTreeNodeが選択されてしまったあとにTreeNodeのTagプロパティからテキストデータを読み取ってテキストボックスに表示させようとするコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) { TreeNode node = treeView1.SelectedNode; if (node != null) node.Tag = textBox1.Text; } private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { TreeNode node = treeView1.SelectedNode; if (node != null) textBox1.Text = (string)node.Tag; } } |
SelectedNode = nullとしたときも当然BeforeSelectイベントとAfterSelectイベントは発生するものと思っていたらそうではないようなのです。
ボタンをクリックするとどこも選択されていない状態になりますが、BeforeSelectイベントもAfterSelectイベントも確認できません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private void button1_Click(object sender, EventArgs e) { treeView1.SelectedNode = null; } private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) { Console.WriteLine("BeforeSelect " + DateTime.Now.ToString()); } private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { Console.WriteLine("AfterSelect " + DateTime.Now.ToString()); } |
それからすでに選択されている部分が削除されるとTreeNodeがすべて削除された場合以外は別のどこかが選択されている状態になります。そのためこの場合はBeforeSelectイベントとAfterSelectイベントは発生します。
「別のどこか」とはどこでしょうか? 削除されたTreeNodeにNextNodeが存在する場合はNextNodeが自動的に選択されます。存在しない場合はPrevNodeが存在する場合はPrevNodeが選択されます。それも存在しない場合はParentが存在する場合はParentが選択されます。それも存在しないときはTreeNodeが削除されることですべてのTreeNodeが削除された場合です。