如何使用TreeView.AfterSelect和TreeView.DrawNode方法?

时间:2012-08-08 19:23:17

标签: c# .net winforms treeview

我的项目中有MyForm.cs, MyForm.Designer.cs个文件,MyForm.Designer.cs我确实喜欢这个:

private System.Windows.Forms.TreeView myTreeView;
this.myTreeView = new System.Windows.Forms.TreeView();
.........
this.myTreeView.AfterSelect += 
                           new TreeViewEventHandler(this.myTreeView_AfterSelect);
MyForm.cs这样的

private void myTreeView_AfterSelect(object sender, TreeViewEventArgs e)
        {
          //........;
        }

我在其他文件(CostumeTreeViewCostumeTreeView.cs)中也有CostumeTreeView.Designer.cs个课程, CostumeTreeView.Designer.cs我确实喜欢这个:

private System.Windows.Forms.TreeView myCostumeTreeView
this.myCostumeTreeView = new System.Windows.Forms.TreeView();
...........
this.myCostumeTreeView.DrawMode = 
                          System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
this.myCostumeTreeView.DrawNode += 
               new DrawTreeNodeEventHandler(this.myCostumeTreeView_DrawNode);
CostumeTreeView.cs中的

private void myCostumeTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
        {
        ........
            //Here is the problem, myTreeView isn't seen here
            e.Node.Tag = myTreeView.SelectedNode.Text; 
        }

我需要在选择myTreeView的节点时,myCostumeTreeView中的所有标签都使用了select函数后更改 (所有方法都在一个命名空间中)

3 个答案:

答案 0 :(得分:1)

如果TreeView控件位于不同的表单上,则需要通过表单属性或事件互相引用,以便控件可以相互通信。

我看到的另一件事是你可能不应该在draw或paint事件中设置一个属性,你在DrawNode事件中使用e.Node.Tag = myTreeView.SelectedNode.Text;。你应该在DrawNode事件中做的唯一事情是绘制节点,其他几乎没有。

要制作引用,你的服装表单需要一个变量,只需将它传递给构造函数,如:

private MyForm mainForm;

private CostumeTreeView(MyForm mf) {
  InitializeComponents();
  mainForm = mf;
}

现在您可以引用TreeView控件:

private void myCostumeTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e) {
  ........
  e.Node.Tag = mainForm.myTreeView.SelectedNode.Text; 
}

同样,不需要使用DrawNode事件来设置节点的标记。您正在创建对GUI的依赖,这将在未来使维护和调试变得困难。

答案 1 :(得分:0)

创建一个协调器类并将两个树传递给协调器。让协调器在选择一棵树之后订阅,然后在选择之后,在另一棵树中执行它应该做的事情。

除非我遗漏了某些东西,否则你不需要所有者全部绘制。

答案 2 :(得分:0)

我认为最好的选择是访问TreeNode类中的Treeview属性。

    e.Node.Tag = e.Node.TreeView.SelectedNode.Text; 

你应该有权访问它。