【问题标题】:treenode's treeview property. How is this set?树节点的树视图属性。这一套怎么样?
【发布时间】:2015-02-17 23:44:50
【问题描述】:

我现在正在设计自定义 TreeNodes 并且想出了一个谜。

TreeNode 的TreeView 属性是一个公共属性,可以用来获取TreeNode 所属的TreeView。我似乎找不到的是这一套怎么样。

我假设它是由 TreeNodeCollection 在调用其中一个 Add 方法时设置的,尽管我无法找到 TreeView 控件如何通过集合将自身的引用传递给 TreeNode。是否使用了未记录的方法或其他方法。或者也许我再次错过了明显的出血,我以这样做而闻名。

感谢您的帮助 丹尼

【问题讨论】:

    标签: c# winforms treeview


    【解决方案1】:

    TreeNode 包含一个内部构造函数,如下所示:

    internal TreeNode(TreeView treeView) : this()
    {
        this.treeView = treeView;
    }
    

    TreeView object调用创建根节点:

    root = new TreeNode(this);
    

    当然,如果 treeView 成员没有设置,它会在你第一次尝试从属性中检索时设置:

    public TreeView TreeView {
        get {
            if (treeView == null)
                treeView = FindTreeView();
            return treeView;
        }
    }
    

    【讨论】:

    • 谢谢罗伯特,这是否意味着当您将 TreeNode 添加到集合时,它会重新创建以便可以调用此构造函数?
    • 推测构造函数被同一个程序集中的某个其他类调用,出于性能原因(设置它意味着不需要调用递归的 FindTreeView())。
    【解决方案2】:

    根据源代码,内部方法FindTreeView 用于递归获取给定TreeNode 的父级。可以看一下源码here

    public TreeView TreeView {
            get {
                if (treeView == null)
                    treeView = FindTreeView();
                return treeView;
            }
        }
    

    注意:上面的片段来自上面发布的源链接。

    此外,正如 Robert Harvey 在他的回答中所解释的,它也可以通过内部构造函数进行设置:

    internal TreeNode(TreeView treeView) : this() {
            this.treeView = treeView;
        }
    

    【讨论】:

    • 是的,但treeView 也可以由内部构造函数设置。看我的回答。
    • @RobertHarvey 真的。我应该编辑我的答案以包含此信息,还是直接删除它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2010-12-08
    相关资源
    最近更新 更多