Необработанное исключение типа ' System.Исключение NullReferenceException' происходит при нажатии узлов дерева


Я продолжаю получать это сообщение об ошибке всякий раз, когда щелкается treenode:

Необработанное исключение типа 'System.NullReferenceException' произошло в Picture-Resize.дополнительная информация: Object ссылка не установлена на экземпляр объекта.

Мой код выглядит следующим образом:

public Form1()
{
    InitializeComponent();
    this.treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler (this.treeView1_NodeMouseClick);
    PopulateTreeView();
}

private void PopulateTreeView()
{
   TreeNode rootNode;

   DirectoryInfo info = new DirectoryInfo(@"c:\");
   if (info.Exists)
   {
       rootNode = new TreeNode(info.Name);
       rootNode.Tag = info;
       GetDirectories(info.GetDirectories(), rootNode);
       treeView1.Nodes.Add(rootNode);
   }
}

private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
{
   TreeNode aNode;
   DirectoryInfo[] subSubDirs;
   foreach (DirectoryInfo subDir in subDirs)
   {
       aNode = new TreeNode(subDir.Name, 0, 0);
       aNode.Tag = subDir;
       aNode.ImageKey = "folder";
       try
       {
           /*  subSubDirs = subDir.GetDirectories();
             if (subSubDirs.Length != 0)
             {
                 GetDirectories2(subSubDirs, aNode);
             }*/
       }
       catch (System.UnauthorizedAccessException)
       {
           subSubDirs = new DirectoryInfo[0];
       }
       nodeToAddTo.Nodes.Add(aNode);
   }
}


void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{               
   //if (treeView1.SelectedNode.Nodes.Count > 0) { MessageBox.Show("Child node exists"); } else { MessageBox.Show("Child Node does not exist"); }

   try
   {
       TreeNode newSelected = e.Node;
     //  treeView1.SelectedNode.Nodes.Add("test");

       listView1.Items.Clear();
       DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
       ListViewItem.ListViewSubItem[] subItems;

       ListViewItem item = null;

       foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories())
       {
           item = new ListViewItem(dir.Name, 0);
           subItems = new ListViewItem.ListViewSubItem[]
            {new ListViewItem.ListViewSubItem(item, "Directory"), 
             new ListViewItem.ListViewSubItem(item, 
                dir.LastAccessTime.ToShortDateString())};
           item.SubItems.AddRange(subItems);
           listView1.Items.Add(item);
       }
       foreach (FileInfo file in nodeDirInfo.GetFiles())
       {
           item = new ListViewItem(file.Name, 1);
           subItems = new ListViewItem.ListViewSubItem[]
            { new ListViewItem.ListViewSubItem(item, "File"), 
             new ListViewItem.ListViewSubItem(item, 
                file.LastAccessTime.ToShortDateString())};

           item.SubItems.AddRange(subItems);
           listView1.Items.Add(item);
       }

       listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
   }
   catch (Exception ex)
   {
        if (ex is System.NullReferenceException || ex is System.UnauthorizedAccessException)
        {
        }
   }
}

Что происходит, так это то, что обработчик исключений ловит его, но поскольку исключение было брошено, он требует, чтобы пользователь дважды щелкнул, чтобы обработчик кликов принял эффект.

Почему я получаю эту ошибку и как ее избежать?

2 2

2 ответа:

  //if (treeView1.SelectedNode.Nodes.Count > 0)
Это действительно неправильно. Узел не выбирается до после срабатывания события NodeMouseClick. Так что этот код, скорее всего, будет бомбить с NRE, если еще не было выбора. И требует дважды щелкнуть, так как первый щелчок дает ранее выбранный узел.

Вместо этого следует использовать свойство e.Node, оно дает вам узел, который был нажат. Намерение кода немного неясно, велика вероятность, что вы на самом деле должны использовать событие AfterSelect вместо этого. Так это еще работает, когда пользователь использует клавиатуру для выбора узлов.

Вам нужно отладить свой код.

Я предполагаю, что вы используете Visual Studio, если да, то сделайте это:

  1. перейдите в меню отладки.
  2. щелкните на исключениях... выбор.
  3. должно появиться следующее диалоговое окно: Введите описание изображения здесь

Примечание флажок исключения среды выполнения Common Language установлен.

При нажатии кнопки ОК теперь, когда вы отлаживаете свой код в любое время, когда исключение создается вашим кодом или платформой .NET Framework, отладчик остановится на строке, которая выбросил исключение. Это значительно облегчает поиск места, где что-то "ломается".