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

标签 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)
        {
          //........;
        }

我在其他文件中也有 CostumeTreeView 类(CostumeTreeView.csCostumeTreeView.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 的节点时,使用after select 函数更改myCostumeTreeView 中的所有标签 (所有方法都在一个命名空间中)

最佳答案

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

我看到的另一件事是,您可能不应该在绘制或绘制事件中设置属性,而您正在使用 e.Node.Tag = myTreeView.SelectedNode.Text;在 DrawNode 事件中。您应该在 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 的依赖,这将使将来的维护和调试变得困难。

关于c# - 如何使用 TreeView.AfterSelect 和 TreeView.DrawNode 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11871697/

相关文章:

c# - 自定义 C# 窗体设计

c# - 富文本框如何高亮文本 block

c# - System.Threading.Tasks 不遵守启动规则?

c# - 使用不带 URI 的 BitmapImage 的 XAML ImageBrush

.net - 复制到其他计算机时无法在 WcfTestClient 中添加服务

c# - 为什么要处理一个肯定会很快被处理掉的对象呢?

c# - 语音识别程序随机显示语法中不存在的那些口语词的预定义词(在 'GramarBuilder()' 中定义)

c# - 将字符串转换为 float 并对其进行格式化 (C#)

c# - 是否有用于获取原始 Properties.Settings 的 API?

c# - 使用 .NET 在 Windows 中检测屏幕录制