C# treeView 是不是有代码可以将子节点安排为其父节点的最后一个子节点

Posted

技术标签:

【中文标题】C# treeView 是不是有代码可以将子节点安排为其父节点的最后一个子节点【英文标题】:C# treeView is there is an code to arrange an child node to be the last child node from its parentC# treeView 是否有代码可以将子节点安排为其父节点的最后一个子节点 【发布时间】:2019-09-09 20:57:54 【问题描述】:

我正在使用treeView在表单上的treeView中显示序列目录及其子目录和文件,我使用以下方法加载树视图

在表单加载中:

        treeView1.Nodes.Clear();
        toolTip1.ShowAlways = true;
        LoadDirectory("C:\\Windows\\System32\\" + inventedName );  

以及以下3种加载目录和子目录及文件的方法

    public void LoadDirectory(string Dir)
    

        DirectoryInfo di = new DirectoryInfo(Dir);

        TreeNode tds = treeView1.Nodes.Add(di.Name);

        tds.Tag = di.FullName;
        //tds.StateImageIndex = 0;
        tds.ImageIndex = 0;
        tds.StateImageIndex = 0;
        tds.SelectedImageIndex = 0;
        LoadFiles(Dir, tds);
        LoadSubDirectories(Dir, tds);
    

    private void LoadSubDirectories(string dir, TreeNode td)
    

        string[] subdirectoryEntries = Directory.GetDirectories(dir);          

        // Loop through them to see if they have any other subdirectories  
        foreach (string subdirectory in subdirectoryEntries)
        

            DirectoryInfo di = new DirectoryInfo(subdirectory);
            TreeNode tds = td.Nodes.Add(di.Name);
            renameNodes(tds);    
            //tds.StateImageIndex = 0;
            tds.Tag = di.FullName;
            tds.ImageIndex = 0;
            tds.StateImageIndex = 0;
            tds.SelectedImageIndex = 0;
            LoadFiles(subdirectory, tds);
            LoadSubDirectories(subdirectory, tds);

        
    

    private void LoadFiles(string dir, TreeNode td)
    
        string[] Files = Directory.GetFiles(dir, "*.pdf");

        // Loop through them to see files  
        foreach (string file in Files)
        
            FileInfo fi = new FileInfo(file);
            TreeNode tds = td.Nodes.Add(fi.Name);
            tds.Tag = fi.FullName;
            tds.ImageIndex = 1;
            tds.StateImageIndex = 1;
            tds.SelectedImageIndex = 1;

        
    

我的问题是子目录(文件夹)有特定的名称,我无法更改它 例如:

> root 
    > parent 
          > 1.0 xxx
          > 1.10 xxx
          > 1.2 xxx
          > 1.3 xxx 
          > 1.4 xxx
          > 1.5 xxx
          > 1.6 xxx
          > 1.7 xxx
          > 1.8 xxx
          > 1.9 xxx

但我需要它是那样的

> root 
    > parent 
         > 1.0 xxx
         > 1.2 xxx
         > 1.3 xxx 
         > 1.4 xxx
         > 1.5 xxx
         > 1.6 xxx
         > 1.7 xxx
         > 1.8 xxx
         > 1.9 xxx
         > 1.10 xxx 

愚蠢的(1.10 xxx)孩子必须在(1.9 xxx)孩子之后 正如我所说,我不能重命名错误的文件夹是否有任何方法可以将其发送为最后一个孩子

谢谢你帮助我

【问题讨论】:

Sorting child nodes of a treeview after populating the treeview in c# winforms的可能重复 您应该对文件列表进行排序。 In this post 你可以在更新部分找到一个函数,将字符串扩展为可排序的数字.. 亲爱的@vik_78 我试过了,但它不适合我 亲爱的@TaW 感谢您的评论,但我使用的是treeView,该方法适用于列表视图 我知道。代码可以教你做什么。而且,正如我所写的,这实际上与 TreeView 无关,而是关于获得一个适当排序的列表,您可以从中创建节点.. 【参考方案1】:

几周前我使用 IEquable 做了一个非常相似的解决方案。我在下面的代码中对文件名进行了排序以获得正确的解决方案

   public class Test
    
        private void LoadFiles(string dir, TreeNode td)
        
            string[] Files = Directory.GetFiles(dir, "*.pdf");
            Files = Files.Select(x => new MySort(x)).OrderBy(x => x).Select(x => x.filename).ToArray();

            // Loop through them to see files  
            foreach (string file in Files)
            
                FileInfo fi = new FileInfo(file);
                TreeNode tds = td.Nodes.Add(fi.Name);
                tds.Tag = fi.FullName;
                tds.ImageIndex = 1;
                tds.StateImageIndex = 1;
                tds.SelectedImageIndex = 1;

            
        
    
    public class MySort : IComparable
    
        private string[] splitvalues  get; set; 
        public string filename  get; set; 

        public MySort(string filename)
        
            this.filename = filename;
            splitvalues = filename.Split(new char[]  '.', ' ' , StringSplitOptions.RemoveEmptyEntries).ToArray();

        
        public int CompareTo(object other)
        
            MySort otherMySort = (MySort)other;
            int min = Math.Min(this.splitvalues.Length, otherMySort.splitvalues.Length);

            for (int i = 0; i < min; i++)
            
                string a = this.splitvalues[i];
                string b = otherMySort.splitvalues[i];

                if (a != b)
                

                    int numberA = 0;
                    int numberB = 0;

                    if (int.TryParse(a, out numberA))
                    
                        if (int.TryParse(b, out numberB))
                        
                            int z = numberA.CompareTo(numberB);
                            //a & b are numbers
                            return numberA.CompareTo(numberB);
                        
                        else
                        
                            //a number b string
                            return -1;
                        

                    
                    else
                    
                        if (int.TryParse(b, out numberB))
                        
                            //a string b number
                            return 1;
                        
                        else
                        
                            // a string b string
                            return a.CompareTo(b);
                        
                    
                
            
            return splitvalues.Length.CompareTo(otherMySort.splitvalues.Length);

        
    

【讨论】:

亲爱的@jdweng 感谢您的帮助我尝试了您的方法,这就是在使用它之前会发生什么ibb.co/dBhDqYD 以及使用该方法后会发生什么 亲爱的@jdweng 感谢您的帮助我尝试了您的方法,这就是使用它之前发生的事情ibb.co/dBhDqYD 以及使用方法ibb.co/0r9ZdJN 之后发生的事情,但我需要它在 1.9 节点之后解决方案【参考方案2】:

您可以从下面的测试代码中看到代码正常工作。我做了一个小改动,添加了一个 Sort() 方法,以便更容易调用代码。其他一切都是一样的。 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1

    class Program
    
        static void Main(string[] args)
        
            string[] input =  "1.7.1", "1.7.10", "1.7.2", "1.7.3", "1.7.4", "1.7.5", "1.7.6", "1.7.7", "1.7.8", "1.7.9" ;
            string[] output = MySort.Sort(input);
        
    
    public class MySort : IComparable
    
        private string[] splitvalues  get; set; 
        public string filename  get; set; 

        public MySort(string filename)
        
            this.filename = filename;
            splitvalues = filename.Split(new char[]  '.', ' ' , StringSplitOptions.RemoveEmptyEntries).ToArray();

        
        public static string[] Sort(string[] input)
        
            return input.Select(x => new MySort(x)).OrderBy(x => x).Select(x => x.filename).ToArray();
        
        public int CompareTo(object other)
        
            MySort otherMySort = (MySort)other;
            int min = Math.Min(this.splitvalues.Length, otherMySort.splitvalues.Length);

            for (int i = 0; i < min; i++)
            
                string a = this.splitvalues[i];
                string b = otherMySort.splitvalues[i];

                if (a != b)
                

                    int numberA = 0;
                    int numberB = 0;

                    if (int.TryParse(a, out numberA))
                    
                        if (int.TryParse(b, out numberB))
                        
                            int z = numberA.CompareTo(numberB);
                            //a & b are numbers
                            return numberA.CompareTo(numberB);
                        
                        else
                        
                            //a number b string
                            return -1;
                        

                    
                    else
                    
                        if (int.TryParse(b, out numberB))
                        
                            //a string b number
                            return 1;
                        
                        else
                        
                            // a string b string
                            return a.CompareTo(b);
                        
                    
                
            
            return splitvalues.Length.CompareTo(otherMySort.splitvalues.Length);

        
    

【讨论】:

代码在句点字符上拆分数字。如果文件名使用的字符与句点不同,则代码将无法正确排序。

以上是关于C# treeView 是不是有代码可以将子节点安排为其父节点的最后一个子节点的主要内容,如果未能解决你的问题,请参考以下文章

C#treeView是一个代码,用于将子节点安排为其父节点的最后一个子节点

C# winform treeview 节点展开状态的图标设置

C# winform开发中,如果treeview的节点太多,导致加载很慢,怎么做可以提给效率?

c# treeview 知道节点name 如何选中节点!

C# winform treeview 怎麼判断是不是包含某个子节点

C# 单击treeview的子节点获取提示