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

本文关键字:节点 异常 视图 winforms 应用程序 单击 为什么 | 更新日期: 2023-09-27 17:58:07

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

我认为发生此异常是因为我在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抱歉英语不好

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

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

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

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

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

节点也是如此。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);
}

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

基本想法是,在单击(或双击?)后,树视图内容会滚动,要么是因为节点展开/折叠,要么是由于它部分可见,然后滚动到视图中(现在不记得了)。因此,您的鼠标指针不再位于该节点上。我认为,在崩溃的情况下,它甚至可能最终没有节点(空白区域)。这反过来又导致单击/双击事件的参数中有错误的节点,如果鼠标位于空白区域,则可能为null。这样,即使你没有做错什么,你也可以很容易地获得NullReferenceException