为什么在winforms应用程序中单击treeview节点时会发生异常?

时间:2011-05-29 17:54:09

标签: c# winforms treeview

我遇到树视图节点的问题。当我点击某些节点时,它会显示一个未处理的异常,并说“对象引用未设置为对象的实例”。

我认为发生此异常是因为我在mouseclick事件中使用了treeview.node.parent和treeview.node.firstnode方法。

你能帮我解释为什么会发生这种异常吗?

我认为错误发生在这个片段中:

private void treeNode_AfterSelected(object o, TreeNodeMouseClickEventArgs e )
{
    // 
    if (e.Node.FirstNode != null && e.Node.Parent!=null && e.Node.Parent.Text == "Tables")
    {
        this.Controls.Remove(dg);
        this.dg= dal.showTable(e.Node.Text,e.Node.Parent.Parent.Text);
        this.dg.Location = new System.Drawing.Point(this.tr.Width + 1, this.menuStrip1.Height + 2);
        this.dg.Size = new System.Drawing.Size(n - dg.Location.X, 300);
        this.dg.BackgroundColor = System.Drawing.Color.White;
        this.tableName = e.Node.Text;    
        this.Controls.Add(dg);

    }

    else if (e.Node.FirstNode == null && e.Node.FirstNode.Text == "Tables")
    {
       dal.changeDatabase(e.Node.Text);

    }
}

p.s抱歉英语不好

2 个答案:

答案 0 :(得分:2)

如果您点击父节点(第一级),然后调用

node.Parent.SomeMethod您将获得NullReference异常,因为其父级为null

进行一些验证以检查Parent是否为空

if(node.Parent != null)
{
  // do stuff
}

对于node.FirstNode也是如此 - 如果此节点没有子节点,它将返回null,因此也要对此进行验证

if(node.FirstNode != null)
{
  // do stuff
}

修改 在您的代码段e.Node.Parent.Parent中,某些父级可以为null,e.Node.FirstNode可以为null,因此您以异常结束

if (e.Node.Parent != null && e.Node.Parent.Text == "Tables")
{
    this.Controls.Remove(dg);
    if(e.Node.Parent.Parent != null)
    { 
       this.dg= dal.showTable(e.Node.Text,e.Node.Parent.Parent.Text);
       this.dg.Location = new System.Drawing.Point(this.tr.Width + 1, this.menuStrip1.Height + 2);
       this.dg.Size = new System.Drawing.Size(n - dg.Location.X, 300);
       this.dg.BackgroundColor = System.Drawing.Color.White;
       this.tableName = e.Node.Text;    
       this.Controls.Add(dg);
    }
}
else if (e.Node.FirstNode != null && e.Node.FirstNode.Text == "Tables")
{
   dal.changeDatabase(e.Node.Text);

}

答案 1 :(得分:1)

我还想补充一点,默认的TreeView中有一个非常烦人的错误。我不记得确切的细节,但我经常遇到它。也许它已经在VS2010中得到了修复,但它绝对存在于VS2008中。

基本思想是点击(或双击?)后滚动树视图内容,因为节点已展开/折叠,或者因为它部分可见,然后滚动到视图中(现在不记得了)。结果,您的鼠标指针不再在该节点上。我认为在崩溃的情况下,它甚至可能最终没有任何节点(空白区域)。反过来,这导致click / doubleclick事件在参数中具有错误的节点,或者如果鼠标在空白区域上,则甚至可能为null。通过这种方式,即使您没有做错任何事情,也可轻松获得NullReferenceException