Treeview节点:“对象引用未设置为对象的实例”

时间:2012-08-26 12:16:58

标签: c# .net exception-handling treeview

我的TreeView控件正在显示某些所选硬盘驱动器的结构。在我的addToParentNode中,我在树视图展开后进行了调用。但是当我将节点从一个方法传递到另一个方法时,会抛出“对象引用未设置为对象的实例”异常。

void addToParentNode(TreeNode childNodes)
{
    DirectoryInfo getDir = new DirectoryInfo(childNodes.Tag.ToString());
    DirectoryInfo[] dirList = getDir.GetDirectories();
    foreach (DirectoryInfo dir in dirList)
    {
        TreeNode parentNode = new TreeNode();
        parentNode.Text = dir.Name;
        parentNode.Tag = dir.FullName;
        childNodes.Nodes.Add(parentNode);
    }
}

private void tv_fileExplore_AfterExpand(object sender, TreeViewEventArgs e)
{
    foreach (TreeNode item in e.Node.Nodes)
    {
        addToParentNode(item);
    }
}

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

根据您对问题的评论,树节点的Tag属性为null

您正在为null方法中的每个树节点分配一个非addToParentNode值,但在某处,必须有一个开始,您必须创建一个根节点。因此,根节点显然仍将其Tag属性设置为null

答案 1 :(得分:0)

没有足够的上下文,但您可以添加一些安全措施,并处理异常(只有在您想要处理它们时才捕获它们。例如,您可以向TreeNode添加工具提示以通知用户此节点有什么问题,

 void addToParentNode(TreeNode childNodes) 
    { 
        if ((childNodes != null) && (childNodes.Tag != null))
        {
            DirectoryInfo getDir = null;
            try {
               getDir = new DirectoryInfo(childNodes.Tag.ToString()); 
            }
            catch(SecurityException) {
                 childNodes.ToolTipText = "no access";
            }
            catch(PathTooLongException) {
                childNodes.ToolTipText = "path more then 254 chars";
            }
            catch(ArgumentException)
            {
               childNodes.ToolTipText = "huh?";
            }
            if (getDir!=null) && (!getDir.Exists) return;
            DirectoryInfo[] dirList = null;
            try {
               dirList = getDir.GetDirectories(); 
            }
            catch(UnauthorizedException) {
                childNodes.ToolTipText = "no access";
            }
            catch(SecurityException)
            {
                 childNodes.ToolTipText = "no access";
            } 
            if (dirList == null) return;
            foreach (DirectoryInfo dir in dirList) 
            { 
                TreeNode parentNode = new TreeNode(); 
                parentNode.Text = dir.Name; 
                parentNode.Tag = dir.FullName; 
                childNodes.Nodes.Add(parentNode); 
            } 
       }
    }