首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c#如何在运行时动态添加树节点

c#如何在运行时动态添加树节点
EN

Stack Overflow用户
提问于 2013-06-22 04:30:12
回答 3查看 18.7K关注 0票数 1

我试图在运行时动态地将节点添加到现有的树视图模拟windows资源管理器中。我有可以工作的代码,但由于发生了大量的递归,它需要2-3分钟来检查c:驱动器上的所有文件并创建树。

我想要做的事情是这样的:

代码语言:javascript
运行
复制
 -NodeClickEvent-
if has children { do nothing }
else { add children and grandchildren to selected node }

这是因为它不必加载整个树,而是每次单击一次加载几个层。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-22 21:02:54

感谢所有的输入;我想我终于想出了如何在这里做我想要做的事情:An unhandled exception of type 'System.NullReferenceException' occurring when clicking TreeNode

我的代码是:

代码语言:javascript
运行
复制
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)
   {               
       try
       {
           DirectoryInfo d = new DirectoryInfo(@e.Node.FullPath);
           if (e.Node.Nodes.Count > 0) { /*Do Nothing.*/ } else { GetDirectories(d.GetDirectories(), e.Node); e.Node.Expand(); }

           TreeNode newSelected = e.Node;
           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)
            {
                // Do Nothing.
            }

       }



   }`
票数 0
EN

Stack Overflow用户

发布于 2013-06-22 04:52:39

http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode

查看同一篇文章中的演示2

创建树视图项目时,在每个树视图项目展开时附加一个虚拟对象,如果虚拟子项在其中,则删除该虚拟子项,如果有,则添加实际的子项。

上面引用的文章很清楚地解释了这一点

票数 1
EN

Stack Overflow用户

发布于 2013-06-22 12:52:15

如果你对树形视图不是很熟悉,那么你可以先学习本教程http://www.dotnetperls.com/treeview,本教程将介绍如何使用树形列表。

下面的链接解释了你正在寻找的东西

http://msdn.microsoft.com/en-us/library/aa984278%28VS.71%29.aspx

http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17243843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档