Quantcast
Channel: Windows Forms General forum
Viewing all articles
Browse latest Browse all 12583

How to keep the tree node sort order when adding/inserting node to a treeview which has a customized TreeViewNodeSorter.

$
0
0

Recently I was working on a treeview, which has a customized TreeViewNodeSorter. I found I could not keep the original tree node order if the TreeViewNodeSorter presented. I'm wondering how I code this TreeViewNodeSorter to achieve my goal. Here is the code example:

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace TreeViewSortTest
{
    public partial class Form1 : Form
    {
        int counter;

        public Form1()
        {
            InitializeComponent();

            TreeNode treeNode4 = new TreeNode("Node4");
            TreeNode treeNode5 = new TreeNode("Node5");
            TreeNode treeNode6 = new TreeNode("Node6");
            TreeNode treeNodeDescending = new TreeNode("Descending", new TreeNode[] {
            treeNode4,
            treeNode5,
            treeNode6});
            TreeNode treeNode1 = new TreeNode("Node1");
            TreeNode treeNode7 = new TreeNode("Node7");
            TreeNode treeNode8 = new TreeNode("Node8");
            TreeNode treeNode9 = new TreeNode("Node9");
            TreeNode treeNodeAscending = new TreeNode("Ascending", new TreeNode[] {
            treeNode7,
            treeNode8,
            treeNode9});
            TreeNode treeNode3 = new TreeNode("Node3");
            this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
            treeNodeDescending,
            treeNode1,
            treeNodeAscending,
            treeNode3});

            treeView1.TreeViewNodeSorter = new MySorter();
        }

        private void buttonSort_Click(object sender, EventArgs e)
        {
            treeView1.Sort();
        }

        private void buttonAdd_Click(object sender, EventArgs e)
        {
            if (treeView1.SelectedNode != null && treeView1.SelectedNode.Parent != null)
            {
                treeView1.SelectedNode.Parent.Nodes.Add("NodeX" + counter++);
            }
            else
            {
                treeView1.Nodes.Add("NodeX" + counter++);
            }
        }

        private void buttonInsert_Click(object sender, EventArgs e)
        {
            if (treeView1.SelectedNode != null)
            {
                if (treeView1.SelectedNode.Parent != null)
                {
                    treeView1.SelectedNode.Parent.Nodes.Insert(treeView1.SelectedNode.Index, "NodeY" + counter++);
                }
                else
                {
                    treeView1.Nodes.Insert(treeView1.SelectedNode.Index, "NodeY" + counter++);
                }
            }
            else
            {
                treeView1.Nodes.Insert(0, "NodeY" + counter++);
            }
        }

        private class MySorter : IComparer
        {
            public int Compare(object x, object y)
            {
                TreeNode tx = x as TreeNode;
                TreeNode ty = y as TreeNode;

                int res = 0;

                if (tx.Parent != null && tx.Parent.Text == "Ascending")
                {
                    res = tx.Text.CompareTo(ty.Text);
                }
                else if (tx.Parent != null && tx.Parent.Text == "Descending")
                {
                    res = -tx.Text.CompareTo(ty.Text);
                }

                return res;
            }
        }
    }
}

Below are some sorting rules:

1. At any time, I need to keep "Descending" child nodes order descending.

2. At any time, I need to keep "Ascending" child nodes order ascending.

3. The first level of nodes need to keep their original order. initially it is "Descending" -> "Node1" -> "Ascending" -> "Node3".

Now what I want to use "Add"/"Insert" button to add/insert new node to any where (parent level and child level), and change their caption as well. 

But I cannot break the 3 rules. How can I achieve this?


Viewing all articles
Browse latest Browse all 12583

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>