【问题标题】:'Checked = True' cause Exception'Checked = True' 导致异常
【发布时间】:2018-11-09 23:16:46
【问题描述】:

遍历一些树列表复选框节点,并尝试将一些子节点设置为 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

【问题讨论】:

  • @KenWhite,对象childNode 已设置并且正在工作,我在该行上有一个断点,它可以工作,直到它尝试设置.checked=true。所以我不确定这是标准“这个异常是什么意思”的副本
  • 显然它不是 set and working 在引发异常的迭代中,否则您将不会得到异常。您阅读了链接副本标题中句子的前半部分(What is),但没有阅读后半部分(how do)。
  • ` if (childNode == null) { MessageBox.Show("node is null"); } childNode.Checked = true;` 仍然抛出问题
  • 所以你认为这个例外是虚构的?它显然是在另一个循环中。

标签: c# winforms


【解决方案1】:

您假设 ActiveNode 有子节点。

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

【讨论】:

  • 谢谢。在此示例中,ActiveNode 将始终有子节点。
  • 无论您多么确定它应该存在,如果没有检查,您永远无法确定任何对象实际上存在。在任何时间点对节点的存在进行假设只会给未来的用户和程序员留下陷阱。在处理一个对象之前,您需要确保它确实存在。
【解决方案2】:

同意 Terry Carmen,您假设 childNode 永远不会为空。但是,正如您所见,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);
}

【讨论】:

  • 感谢您的回复,我刚刚尝试过,它仍然抛出异常。我知道在我正在寻找的场景中,总会有一个孩子点头。
  • 可能是我,但我看不出这是如何引发异常的。当检查的属性发生变化时,是否还有其他代码会触发?
  • 我刚刚发布了解决方案,但基本上随着 childNode 的更新,它导致事件 afterchecked 再次运行,这次使用 childNode 作为 activeNode(因为这是节点刚刚更新),这似乎是导致问题的原因
【解决方案3】:

现在答案似乎很明显。随着代码的执行,childNode.checked 正在被修改,它会再次调用要运行的函数,这次是在更新的节点上,因为正在更新的节点会调用 afterchecked 事件。

包裹起来

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

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

【讨论】:

  • 怎么传ActiveNode.Parent == null如果是子节点传入呢?
猜你喜欢
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2011-06-08
  • 2017-02-16
相关资源
最近更新 更多