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?