如何调用扩展类

时间:2015-09-09 11:58:43

标签: c#

我尝试在Form中调用扩展类,对于TreeView,该类是:

namespace Extension
{
    public static class ExtensionClass
    {
        public static List<TreeNode> Parents(this TreeNode node)
        {
            var parents = new List<TreeNode>();
            TreeNode parent = node.Parent;
            while (parent != null) ;
            {
                parents.Add(parent);
                parent = parent.Parent;
            }
            return parents;
        }

        public static void CheckChildren(this TreeNode node)
        {
            if (!node.Checked)
                return;

            foreach (TreeNode node1 in node.Nodes)
            {
                node1.Checked = true;
                node1.CheckChildren();
            }
        }

        public static TreeNode CheckParentsAndChildren(this TreeNode node)
        {
            TreeNode parent = node.Parent;
            while (parent != null) ;
            {
                parent.Checked = true;
                parent.CheckChildren();
                parent = parent.Parent;
            }
            return parent;
        }
    }
}

并在Form我添加了using Extension;。但是这段代码不起作用,什么也没发生,而且按照我对此代码2的方式警告:&#34;可能出错的空语句&#34;。 我的问题是如何称呼这门课程?我必须在Form中添加一些内容:

using Extension;
namespace WindowsFormsApplication2
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
        }

2 个答案:

答案 0 :(得分:3)

使用这些扩展方法,就好像它们是TreeNode

的方法一样
private bool _checking;

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (!_checking && e.Node.Checked) {
        _checking = true;
        try {
            e.Node.CheckParentsAndChildren();
        } finally {
            _checking = false;
        }
    }
}

请注意,这只是syntactic sugar。上面的扩展方法调用相当于:

ExtensionClass.CheckParentsAndChildren(e.Node);

您的代码存在逻辑问题。 在CheckParentsAndChildren中,您不仅要检查节点的所有父节点,还要检查所有这些父节点的所有子节点。结果就是你正在检查整棵树!

CheckParentsAndChildren应该只检查当前节点的子节点

public static void CheckParentsAndChildren(this TreeNode node)
{
    node.CheckChildren(); // Check children of current node only.
    TreeNode parent = node.Parent;
    while (parent != null) // ; <-- this semicolon was the problem!!
    {
        parent.Checked = true;
        parent = parent.Parent;
    }
}

此方法也应该有void返回类型。

此外,您应该使用AfterCheck事件(在设置或清除复选标记后发生)而不是AfterSelect事件(在选择节点后发生)并测试用户是在检查还是取消选中。

还有一个问题是,当您以编程方式检查节点时会触发AfterCheck。因此,我介绍了在检查代码中的节点之前设置的guard _checking,以防止重复调用treeView1_AfterCheck。为了确保在作业完成后将重置防护,即使发生异常,我也会将代码放在try-finally语句中。

答案 1 :(得分:0)

当然没有任何事情发生,因为你永远不会调用那些扩展方法。只因为它们存在于您的代码中并不意味着它们会被执行。因此,在树的事件处理程序中添加相关代码:

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    e.Node.CheckParentsAndChildren();
    e.Node.CheckChildren();
    var parents = e.Node.Parents();
}

另请查看extension methods