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?