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

C# 如何使用TreeView.AfterSelect和TreeView.DrawNode方法?,c#,.net,winforms,treeview,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 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);
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);
MyForm.cs
中,如下所示:

private void myTreeView_AfterSelect(object sender, TreeViewEventArgs e)
        {
          //........;
        }
另外,我在其他文件(
customtreeview.cs
customtreeview.Designer.cs
)中有
customtreeview
customtreeview.Designer.cs
我喜欢这样:

private System.Windows.Forms.TreeView myTreeView;
this.myTreeView = new System.Windows.Forms.TreeView();
.........
this.myTreeView.AfterSelect += 
                           new TreeViewEventHandler(this.myTreeView_AfterSelect);
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);
客户树视图.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的节点时,使用after select功能更改MyStudMetreeView中的所有标记
(所有方法都在一个命名空间中)

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


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

要进行引用,您的costment表单需要一个变量,只需将其传递给构造函数,如下所示:

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上创建一个依赖项,这将使将来的维护和调试变得困难。

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


除非我遗漏了什么,否则您不需要全部绘制。我认为最好的选择是访问TreeNode类中的Treeview属性

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

你应该有权访问它。

e.Node.Tag=myTreeView.SelectedNode.Text
-这只是DrawNode方法的一部分,我真的需要它,因为我正在完全更改drawing
TreeView
CustomerTreeview
的格式不同,如何使用事件?你能给我举个例子吗?如何将
myTreeView.SelectedNode.Text
从一个控件返回到另一个控件(从
TreeView
custometereview
)@Steven更新了如何将引用从父窗体传递到另一个窗体的示例。