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

本文关键字:TreeView DrawNode 方法 AfterSelect 何使用 | 更新日期: 2024-11-07 11:58:46

我的项目中有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)
        {
          //........;
        }

我也在其他文件(CostumeTreeView.csCostumeTreeView.Designer.cs)中CostumeTreeView类,在 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中的所有标签都使用选择功能进行更改(所有方法都在一个命名空间中)

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

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

我看到的另一件事是,您可能不应该在绘制或绘制事件中设置属性,这是您在 DrawNode 事件中使用e.Node.Tag = myTreeView.SelectedNode.Text;执行的。 在 DrawNode 事件中,您唯一应该做的就是绘制节点,其他很少。

为了进行引用,您的服装形式需要一个变量,只需将其传递到构造函数中,如下所示:

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

现在,您可以引用树视图控件:

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

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

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

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

你应该有访问权限。

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

除非我错过了什么,否则你不需要所有者绘制它。