Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Сортировка узлов treeView


Автор: Sartorius 5.2.2007, 12:11
Всем привет smile 
Возникла следующая проблема : отсортировать коллекцию нод к которой принадлежит выделенная в алфавитном порядке... но чего-то не получается. Не обращайте внимание на неэффективность кода - это я уже извращался. Просто я .NET до этого практически не писал - поэтому могут быть совсем тупые ошибки

Код

private void sortNodes()
        {
            TreeNodeCollection Nodes;

            if (treeView1.SelectedNode == null) return;
            if (treeView1.SelectedNode.Parent == null)
            {
                if (treeView1.Nodes != null) 
                    Nodes = treeView1.Nodes;
                else
                    return;

            }
            else
            {
                if (treeView1.SelectedNode.Parent.Nodes != null)
                    Nodes = treeView1.SelectedNode.Parent.Nodes;
                else
                return;
            }

            TreeNode[] Ar = new TreeNode[Nodes.Count];
            if (Nodes.Count == 0)
                return;
            int i = 0;
            foreach (TreeNode tn in Nodes)
            {
                Ar[i] = (TreeNode)tn.Clone();
            }            

            Nodes.Clear();

            TreeNode tn1, tn2, tn3;
            int index;
            for (i = Nodes.Count - 1; i > 0; i--)
                for (int j = 0; j < i; j++)
                {
                    tn1 = Ar[j];
                    tn2 = Ar[j + 1];
                    if (tn2.Text.CompareTo(tn1.Text) < 0)
                    {
                        Ar[j + 1] = tn1;
                        Ar[j] =     tn2;

                    }                    
                }
            for(i = 0; i < Ar.Length; i++)
                Nodes.Insert(i, Ar[i]); // <- от тут вот исключение - Ar[i] нулевой оказался
        }


Автор: mr.DUDA 5.2.2007, 13:23
А так:
Код
using System;
using System.Windows.Forms;
using System.Collections;

namespace WindowsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        class SelectedTreeSorter : IComparer
        {
            TreeNode _selectedNode;

            public SelectedTreeSorter(TreeNode selectedNode)
            {
                _selectedNode = selectedNode;
            }

            public int Compare(object ox, object oy)
            {
                TreeNode x = (TreeNode)ox;
                TreeNode y = (TreeNode)oy;

                // сортируем только узлы под выделенным, для остальных - 0 ("одинаковые")
                if (x.Parent != _selectedNode || y.Parent != _selectedNode)
                    return 0;

                return x.Text.CompareTo(y.Text);
            }
        }

        void sortNodes()
        {
            treeView1.TreeViewNodeSorter = new SelectedTreeSorter(treeView1.SelectedNode);
            treeView1.Sort();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            sortNodes();
        }
    }
}


Автор: Sartorius 5.2.2007, 19:27
mr.DUDA,  спасибо... Эх забыл указать. Нужен Compact Framework. (Я под Windows Mobile пишу) А там много чего нет. Нет, например, метода Sort() у TreeView.  smile   

Автор: Sartorius 6.2.2007, 11:29
  smile  Больше так долго за компом сидеть не буду :
Код

            foreach (TreeNode tn in Nodes)
            {
                Ar[i] = (TreeNode)tn.Clone();
            }      


 Забыл i++;

Код

Nodes.Clear();

 Почистил, а потом
Код

for (i = Nodes.Count - 1; i > 0; i--)


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)