'Checked = True'导致例外

时间:2018-05-31 02:41:07

标签: c# winforms

循环访问一些treelist复选框节点,并尝试将一些子节点设置为true。当我尝试设置一个时,无论是真还是假,都会导致异常。

'childNode.Checked' threw an exception of type 'System.NullReferenceException'

我错过了一些明显的东西吗?

感谢

private void FluidFilterTree_AfterCheck(object sender, TreeViewEventArgs e)
    {
        TreeNode ActiveNode = e.Node;
        TreeNode childNode = ActiveNode.FirstNode;
        if (ActiveNode.Parent == null) // if null it is the parent, check all children
        {
            for (int x = 0; x < ActiveNode.GetNodeCount(false); x++) // loop through children nodes
            {
                childNode.Checked = false; //?

                childNode = childNode.NextNode;
            }
        }

        MessageBox.Show(e.Node.Text);
    }

对象childNode已设置且正在运行,我在该行上有一个断点,它一直有效,直到它尝试设置.checked = true。所以我不确定这是标准的重复“这个异常意味着什么”我理解异常但不确定为什么它在这种情况下是相关的,因为我知道childNode和true都存在

更改前的断点checked Breakpoint before changing <code>checked</code>

3 个答案:

答案 0 :(得分:1)

你假设ActiveNode有孩子。

这不一定是真的。如果没有子节点,则ActiveNode.FirstNode为null,您无法引用Checked属性。

答案 1 :(得分:1)

同意Terry Carmen,你假设childNode永远不会为null。但是,正如您所看到的那样NullReferenceException被抛出,事实并非如此。怎么样,更安全的例子:

private void FluidFilterTree_AfterCheck(object sender, TreeViewEventArgs e)
{
    var activeNode = e.Node;
    if (activeNode.Parent == null)
        foreach (TreeNode child in activeNode.Nodes)
            child.Checked = false;

    MessageBox.Show(e.Node.Text);
}

答案 2 :(得分:1)

答案现在看来非常明显。当代码正在执行,并且childNode.checked被修改时,它再次调用该函数,这次是在更新的节点上,因为这个更新会调用afterchecked事件。

将其包装在

if (e.Action.ToString() == "ByMouse")
{
    // code here
}

似乎正在工作,并阻止它被多次调用。