【问题标题】:An unhandled exception of type 'System.NullReferenceException' occurring when clicking TreeNode单击 TreeNode 时发生“System.NullReferenceException”类型的未处理异常
【发布时间】:2013-06-22 13:31:09
【问题描述】:

每当单击树节点时,我都会收到此错误消息:

“System.NullReferenceException”类型的未处理异常 发生在 Picture-Resize.exe 附加信息:对象 引用未设置为对象的实例。

我的代码如下:

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)
        {
        }
   }
}

发生的情况是异常处理程序捕获了它,但是由于抛出了异常,它需要用户单击两次才能使单击处理程序生效。

为什么会出现此错误,如何避免?

【问题讨论】:

  • 在哪一行代码抛出异常
  • 这种异常很容易调试和修复,你应该指出(突出显示)抛出异常的代码行。在不知道代码行的情况下,我认为这里的任何人都无法(随意)跟踪从 NodeMouseClick 事件处理程序的开始到结束的所有内容来帮助您。
  • 我复制了你的代码,没有任何异常!
  • 在我注释掉的那一行抛出异常:(抱歉造成混淆)//if (treeView1.SelectedNode.Nodes.Count > 0) { MessageBox.Show("Child node exists"); } else { MessageBox.Show("Child Node does not exist"); }

标签: c# winforms treeview


【解决方案1】:

你需要调试你的代码。

我假设您使用的是 Visual Studio,如果是,请执行以下操作:

  1. 转到“调试”菜单。
  2. 点击例外...选项。
  3. 应出现以下对话框:

注意公共语言运行时异常复选框已选中。

单击“确定”后,现在当您在代码或 .NET Framework 引发异常时调试代码时,调试器将在引发异常的行停止。这样可以更轻松地找到“损坏”的地方。

【讨论】:

    【解决方案2】:
      //if (treeView1.SelectedNode.Nodes.Count > 0)
    

    这确实是错误的。直到 NodeMouseClick 事件触发后才会选择节点。因此,如果还没有选择,则此代码可能会与 NRE 一起轰炸。并且需要单击两次,因为第一次单击会给出先前选择的节点。

    您应该改用e.Node 属性,它为您提供被点击的节点。代码的意图有点不清楚,您实际上应该使用AfterSelect 事件的可能性很大。所以当用户使用键盘选择节点时它仍然有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多