类型'System.NullReferenceException“未处理的异常发生的点击树节点时, [英] An unhandled exception of type 'System.NullReferenceException' occurring when clicking TreeNode

查看:997
本文介绍了类型'System.NullReferenceException“未处理的异常发生的点击树节点时,的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




类型的未处理的异常'System.NullReferenceException'$ B:

每当点击一个TreeNode我不断收到此错误信息$ b发生在画中画Resize.exe其他信息:对象
引用不设置到对象的实例




我的代码如下:

 公共Form1中()
{
的InitializeComponent();
this.treeView1.NodeMouseClick + =新TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick);
PopulateTreeView();
}

私人无效PopulateTreeView()
{
树节点rootNode中;

DirectoryInfo的信息=新的DirectoryInfo(@C:\\);
如果(info.Exists)
{
rootNode中=新的TreeNode(info.Name);
rootNode.Tag =信息;
GetDirectories(info.GetDirectories(),rootNode中);
treeView1.Nodes.Add(rootNode中);
}
}

私人无效GetDirectories(DirectoryInfo的[]子目录,树节点nodeToAddTo)
{
树节点阳极;
DirectoryInfo的[] subSubDirs;
的foreach(DirectoryInfo的子目录中的子目录)
{
阳极=新的TreeNode(subDir.Name,0,0);
aNode.Tag = SUBDIR;
aNode.ImageKey =文件夹;

{
/ * subSubDirs = subDir.GetDirectories();
如果(subSubDirs.Length!= 0)
{
GetDirectories2(subSubDirs,阳极);
} * /
}
赶上(System.UnauthorizedAccessException的)
{
subSubDirs =新的DirectoryInfo [0];
}
nodeToAddTo.Nodes.Add(阳极);
}
}


无效treeView1_NodeMouseClick(对象发件人,TreeNodeMouseClickEventArgs E)
{
//如果(treeView1.SelectedNode.Nodes。计数大于0){MessageBox.Show(子节点存在); }其他{MessageBox.Show(子节点不存在); }


{
树节点newSelected = e.Node;
// treeView1.SelectedNode.Nodes.Add(测试);

listView1.Items.Clear();
DirectoryInfo的nodeDirInfo =(DirectoryInfo的)newSelected.Tag;
ListViewItem.ListViewSubItem []子项目;

ListViewItem的项目= NULL;

的foreach(DirectoryInfo的DIR在nodeDirInfo.GetDirectories())
{
项=新的ListViewItem(dir.Name,0);
子项目=新ListViewItem.ListViewSubItem []
{新ListViewItem.ListViewSubItem(项目,目录),
新ListViewItem.ListViewSubItem(项目,
dir.LastAccessTime.ToShortDateString( ))};
item.SubItems.AddRange(子项目);
listView1.Items.Add(项目);
}
的foreach(在nodeDirInfo.GetFiles FileInfo的文件())
{
项=新的ListViewItem(file.Name,1);
子项目=新ListViewItem.ListViewSubItem []
{新ListViewItem.ListViewSubItem(项目,文件),
新ListViewItem.ListViewSubItem(项目,
file.LastAccessTime.ToShortDateString( ))};

item.SubItems.AddRange(子项目);
listView1.Items.Add(项目);
}

listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
}
赶上(异常前)
{
如果(当然是System.NullReferenceException ||恩是System.UnauthorizedAccessException的)
{
}
}
}

什么情况是异常处理程序捕获它,而是因为一个异常被扔它要求用户点击两次单击处理程序才能生效。



为什么会出现这种错误,以及如何避免呢?


解决方案

  //如果(treeView1.SelectedNode.Nodes.Count大于0)

这的确是错误的。一个节点没有选择到的之后的的NodeMouseClick事件触发。所以这个代码很可能与NRE轰炸,如果没有选择呢。并且需要点击两次,因为第一次点击给先前选定的节点。



您应该改为使用 e.Node 财产,它可以让你单击的节点。代码的目的是,你实际上应该使用 AfterSelect 事件,而不是有点不清楚,强大的几率。当用户使用键盘选择节点,以便它仍然有效。


I keep getting this error message whenever a treenode is clicked on:

An unhandled exception of type 'System.NullReferenceException' occurred in Picture-Resize.exe Additional information: Object reference not set to an instance of an object.

My code is as follows:

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

What happens is the exception handler catches it, but because an exception was thrown it requires the user to click twice for the click handler to take effect.

Why am I getting this error, and how do I avoid it?

解决方案

  //if (treeView1.SelectedNode.Nodes.Count > 0)

That is indeed wrong. A node isn't selected until after the NodeMouseClick event fires. So this code is likely to bomb with NRE if there wasn't a selection yet. And requires clicking twice since the first click gives the previously selected node.

You should instead use the e.Node property, it gives you the node that was clicked. The intention of the code is a bit unclear, strong odds that you actually should be using the AfterSelect event instead. So it still works when the user uses the keyboard to select nodes.

这篇关于类型'System.NullReferenceException“未处理的异常发生的点击树节点时,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆