如何覆盖 TreeNodeCollection.Add(TreeNode)?

How do I override TreeNodeCollection.Add(TreeNode)?

我有这个:

public abstract class DRT_Tvw_Abstract : TreeView
{
    TableCountMetrics metrics;
    public TableCountMetrics Metrics { get => metrics; set => metrics = value; }

    public class TableCountMetrics
    {
        int schemaNameCount = 0;
        int tableNameCount = 0;

        public int SchemaNameCount { get => schemaNameCount; set => schemaNameCount = value; }
        public int TableNameCount { get => tableNameCount; set => tableNameCount = value; }
    }

    public DRT_Tvw_Abstract() : base()
    {
    }
}

public class DRT_Tvw_TableList_Unfiltered : DRT_Tvw_Abstract
{
    public DRT_Tvw_TableList_Unfiltered() : base()
    {
    }

    public void _CreateTreeView(DataTable dataTable)
    {
        tableListTreeViewNode = new {treeview node from my class that derives from TreeNode}

        Nodes.Add(tableListTreeViewNode);       
}

我想要做的是 override Add 方法,这样我就可以 increment/decrement 自定义整数属性,它们是我的 DRT_Tvw_Abstract class 的一部分同时我Add一个TreeNode。我开始尝试从 TreeNodeCollection class 派生,但这似乎是一个死胡同,因为我无法弄清楚 TreeNodeCollection [=33] 的有效构造函数是什么=]

Nodes(如 Nodes.Add)是一个 属性。我如何从中派生,以便我可以覆盖 Add 方法?我开始为此 poprperty 创建一个覆盖,但我不知道如何从 属性 覆盖代码中覆盖方法 (Add)。

public new virtual TreeNodeCollection Nodes
{

    //override the Add method from within here somehow?

    get
    {
        return base.Nodes;
    }

    set
    {
    }
}

覆盖 TreeNodeCollection class Add(TreeNode) 方法的语法是什么?

Add 方法属于 TreeNodeCollection class。如果你喜欢新的 Add 带有新签名的方法:

  • 自然地,您可能会考虑从 TreeNodeCollection 派生并定义新方法并从 TreeView 派生并将其 TreeNodeCollection 替换为新的自定义节点集合。但是不要尝试这个解决方案。 TreeNodeCollection 没有 public 构造函数。所以我建议创建 Extension Methods.

  • 您可能想到的另一个解决方案是从 TreeView 派生并向派生的 TreeView 添加新的 Add 方法。

示例 - 扩展方法

新建一个代码文件,复制以下代码粘贴到代码文件中:

namespace MyExtensions
{
    using System.Windows.Forms;
    public static class TreeNodeCollectionExtensions
    {
        //Just an example of a new signature, use the signature that you need instead:
        public static TreeNode Add(this TreeNodeCollection nodes, string text, int tag)
        {
            var node = nodes.Add(text);
            node.Tag = tag;
            return node;
        }
    }
}

然后在你要使用新的Add方法的class中,首先添加using语句:

using MyExtensions;

然后像正常方法一样使用它:

treeView1.Nodes.Add("One", 1);