Почему возникает исключение при щелчке узлов дерева в приложении winforms? - PullRequest
2 голосов
/ 29 мая 2011

У меня проблема с узлами в виде дерева.Когда я щелкаю по некоторым узлам, возникает необработанное исключение, которое говорит: «Ссылка на объект не установлена ​​на экземпляр объекта».

Я думаю, что это исключение возникает, потому что я использую treeview.node.Методы parent и treeview.node.firstnode в событии mouseclick.

Не могли бы вы объяснить, почему происходит это исключение?

Я думаю, что ошибка в этом фрагменте:

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);

    }
}

PS извините за плохой английский

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

Если вы нажмете на родительские узлы (1-й уровень) и затем вызовете

node.Parent.SomeMethod вы получите исключение NullReference, поскольку его Parent равен null

Поместите некоторую проверку, чтобы проверить, не является ли Родитель не нулевым

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

Та же ситуация для node.FirstNode - он вернет null, если для этого узла нет дочерних элементов, поэтому также поставьте проверку для этого

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

EDIT: в вашем фрагменте e.Node.Parent.Parent некоторые из родителей могут быть нулевыми, а e.Node.FirstNode может быть нулевыми, поэтому вы заканчиваете исключением

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 голос
/ 29 мая 2011

Я также хотел бы добавить, что есть ОЧЕНЬ досадная ошибка в TreeView по умолчанию. Я не помню точных деталей, но я встречал это часто. Возможно, это исправлено в VS2010, но определенно было в VS2008.

Основная идея заключалась в том, что после щелчка (или двойного щелчка?) Содержимое древовидной структуры прокручивалось либо потому, что узел развернулся / свернулся, либо потому, что он был частично видимым, а затем прокручивался в представление (не помню сейчас). В результате указатель мыши больше не был над этим узлом. Я думаю, что в случае коллапса это может закончиться тем, что вообще не будет ни одного узла (пустая область). В свою очередь это привело к тому, что событие click / doubleclick имело неправильный узел в аргументе или, возможно, даже ноль, если мышь находилась над пустой областью. Таким образом, вы можете легко получить свой NullReferenceException, даже если вы не сделали ничего плохого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...