zoukankan      html  css  js  c++  java
  • 递归示例(四):WinForm之TreeView的应用—绑定磁盘目录(二)

    当具有树形结构的数据的结点很多而且树的深度比较大时,直接用递归遍历明显能发现性能很低。因此,不要一次全部加载,而是当用户点击展开时才加载此结点下的子结点。

    实现要点:

    每加载添加一个结点时,判断该结点是否为叶子(即不含子结点),若包含子结点,先添加一个空的子节点,这样做主要是让用户在界面能看到“+”表示结点能展开。当用户点击“+”时触发treeView_AfterExpand事件,在该事件中处理添加子结点数据,添加之前,清理删除掉以前的结点。

     

     

    public partial class MainForm2 : Form
    {
    public MainForm2()
    {
    InitializeComponent();
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    }

    private void MainForm2_Load(object sender, EventArgs e)
    {
    BindDrives();
    }

    private void BindDrives()
    {
    DriveInfo[] drvs
    = DriveInfo.GetDrives();
    foreach (DriveInfo drv in drvs)
    {
    TreeNode root
    = new TreeNode();
    root.Text
    = drv.Name;
    root.Tag
    = drv.RootDirectory.ToString();
    // root.Nodes.Add("");
    treeView1.Nodes.Add(root);
    if (Directory.Exists(drv.RootDirectory.ToString()))
    {
    DirectoryInfo dInfo
    = new DirectoryInfo(drv.RootDirectory.ToString());

    FileSystemInfo[] files
    = dInfo.GetFileSystemInfos();
    if (files.Length > 0) //有子节点,先添加一个空节点
    {
    root.Nodes.Add(
    "emptyNode", string.Empty);
    }
    }
    }
    }

    //展开节点,移除以前的空节点,加载子节点
    private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
    {

    TreeNode parentNode
    = e.Node;
    // parentNode.Nodes.RemoveByKey("emptyNode");//移除空节点
    parentNode.Nodes.Clear();
    string path = parentNode.Tag.ToString();

    if (Directory.Exists(path))
    {
    DirectoryInfo dir
    = new DirectoryInfo(path);

    FileSystemInfo[] files
    = dir.GetFileSystemInfos();
    foreach (FileSystemInfo f in files)
    {
    TreeNode node
    = new TreeNode();
    node.Text
    = f.Name;
    node.Tag
    = f.FullName;
    parentNode.Nodes.Add(node);
    //加载子节点

    if (Directory.Exists(node.Tag.ToString()))
    {
    DirectoryInfo subDir
    = new DirectoryInfo(node.Tag.ToString());
    if (subDir.Attributes != (FileAttributes.System | FileAttributes.Hidden | FileAttributes.Directory))
    {
    FileSystemInfo[] subFiles
    = subDir.GetFileSystemInfos();
    if (subFiles.Length > 0) //有子节点,先添加一个空节点
    {
    node.Nodes.Add(
    "emptyNode", string.Empty);
    }
    }
    }
    }

    }

    

    

    运行结果如图:

    

    

     

    

    

    这样,只加载用户要展开的结点,而且每次只加载当前结点的下一代,性能明显能提升,当然还能用多线程技术改善性能、用WindowsAPI获取文件图标并关联TreeView结点,这里就不介绍了。

     

     

     代码:https://files.cnblogs.com/sndnnlfhvk/TViewSource.rar

    递归示例(一):遍历二叉树 http://www.cnblogs.com/sndnnlfhvk/archive/2011/03/31/2001015.html
    递归示例(二):WinForm之TreeView的应用—绑定区域树  http://www.cnblogs.com/sndnnlfhvk/archive/2011/03/31/2001064.html
    递归示例(三):WinForm之TreeView的应用—绑定磁盘目录(一)  http://www.cnblogs.com/sndnnlfhvk/archive/2011/03/31/2001065.html
    递归示例(四):WinForm之TreeView的应用—绑定磁盘目录(二)  http://www.cnblogs.com/sndnnlfhvk/archive/2011/03/31/2001072.html

           

  • 相关阅读:
    使用批处理bat作为日期系统日期的前三天
    电脑桌面显示倒退
    BZOJ 2648/2716(SJY把件-KD_Tree)[Template:KD_Tree]
    yii使用寻呼功能
    宝付额度
    vs2010旗舰版产品密钥
    考察网贷平台是否正规,仅供参考。
    sql server 修改字段大小
    帕累托分析法
    帕累托分析法(Pareto Analysis)(柏拉图分析)
  • 原文地址:https://www.cnblogs.com/sndnnlfhvk/p/2001072.html
Copyright © 2011-2022 走看看