同期化されたTreeViewを複数作成して、ひとつのTreeNodeのTextが変更されたら他のビューにも反映させます。
今回は簡単です。今回もこれを使います。
1 2 3 4 5 6 7 8 9 10 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); syncTreeView1.LabelEdit = true; syncTreeView2.LabelEdit = true; } } |
これでラベルを変更することができます。ラベルを変更すると対応する別のTreeViewのノードのラベルも変更されます。SyncTreeView内ではこのような処理がおこなわれています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class SyncTreeView { public delegate void AfterLabelEditHandler(SyncTreeView sender, NodeLabelEditEventArgs e); public event AfterLabelEditHandler AfterLabelEdit; private void TreeViewEx1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { OnAfterLabelEdit(e); } protected virtual void OnAfterLabelEdit(NodeLabelEditEventArgs e) { AfterLabelEdit?.Invoke(this, e); if (e.Label == null || e.CancelEdit) return; TreeNodeEx nodeEx = GetTreeNodeEx(e.Node); nodeEx.Text = e.Label; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class TreeNodeEx { internal string _text = ""; public string Text { set { if (_group == null) _text = value; else { foreach (var view in _group.TreeViews) { TreeNode[] nodes = view.Nodes.Find(_key, true); if (nodes.Length == 1) { nodes[0].Text = value; } } } } } } |
OnAfterLabelEditメソッドの引数をしらべれば、どのノードのラベルがどんな文字列に変更されたのかを知ることができます。
注意することとして、ラベルを変更しようとしたけど変更しなかった場合、NodeLabelEditEventArgs.Label == nullになることがあげられます。そのためSyncTreeView.OnAfterLabelEdit内でe.Label == nullのときはなにもしないことにしています。
これで片方のラベルを変更するともうひとつのTreeViewにも反映されるようになります。
ちょっとこれでは短すぎる(1000文字に満たない)ので、アイコンも同じように変化させるプログラムをつくります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { private void toolStripButton1_Click(object sender, EventArgs e) { var node = syncTreeView1.SelectedNode; node.ImageIndex = 0; node.SelectedImageIndex = 0; } private void toolStripButton2_Click(object sender, EventArgs e) { var node = syncTreeView1.SelectedNode; node.ImageIndex = 1; node.SelectedImageIndex = 1; } private void toolStripButton3_Click(object sender, EventArgs e) { var node = syncTreeView1.SelectedNode; node.ImageIndex = 2; node.SelectedImageIndex = 2; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class TreeNodeEx { public int ImageIndex { set { if (_group == null) _imageIndex = value; else { foreach (var view in _group.TreeViews) { TreeNode[] nodes = view.Nodes.Find(_key, true); if (nodes.Length == 1) { nodes[0].ImageIndex = value; } } } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class TreeNodeEx { public int SelectedImageIndex { get { return _selectedImageIndex; } set { if (_group == null) _selectedImageIndex = value; else { foreach (var view in _group.TreeViews) { TreeNode[] nodes = view.Nodes.Find(_key, true); if (nodes.Length == 1) { nodes[0].SelectedImageIndex = value; } } } } } } |
上記は複数のTreeViewの対応するアイコンを同時に変更します。
下記はひとつのTreeViewのアイコンのみを変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class TreeNodeEx { public void SetImageIndex(int imageIndex, SyncTreeView treeView) { TreeNode[] nodes = treeView.treeViewEx1.Nodes.Find(this.Key, true); if (nodes.Length == 1) nodes[0].ImageIndex = imageIndex; } public void SetSelectedImageIndex(int imageIndex, SyncTreeView treeView) { TreeNode[] nodes = treeView.treeViewEx1.Nodes.Find(this.Key, true); if (nodes.Length == 1) nodes[0].SelectedImageIndex = imageIndex; } } |