我遇到树视图节点的问题。当我点击某些节点时,它会显示一个未处理的异常,并说“对象引用未设置为对象的实例”。
我认为发生此异常是因为我在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抱歉英语不好
答案 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
。