如何在Treeview.Sort之后将Treeview重置为默认显示?

时间:2015-02-18 23:25:26

标签: c# winforms sorting treeview

我试图按字母顺序显示树视图的节点,并设法通过以下方式完成它:

treeview1.Sort();  

它完成排序工作。但是我希望可以选择将树视图恢复到原来的显示状态(不进行字母排序)。

on another question我看到我可以使用treeview的属性:.sorted并将其设置为true或false但它对我没有任何作用。< / p>

我在控件中有数据,它已经在设计时设置了。

这样做的最佳方式是什么?

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

当然,从外部来源获取内容将是填充Tree的最灵活方式,但是..

..因为树的内容已添加到设计器中,如果涉及到大量数据,最佳路径可能是通过将设计器代码移动到神奇的Unsort函数来挽救这些数据你可以随时打电话。

好好查看表单Designer.cs文件!在这里,您可以找到两个部分来处理TreeView

的加载
  • 第一个坐在禁止的内部&#39;部分:InitializeComponent()带有可怕的警告,你不应该改变那里的任何东西。好吧,不要担心我们所做的就是从它复制几行到unsort函数..

我们需要的是声明和创建节点的所有行。它们看起来像这样:

System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("John");

现在向下滚动到以

开头的部分
   // 
   // treeView1
   // 

我们并不关心将NameLocation分配给TreeView的前几行。但我们希望所有以下行设置Names和{{1>} 所有 Texts;以及将根节点添加到Nodes ..

的所有行

我们将所有这些复制到一个函数中,该函数首先清除TreeView并重置Nodes属性。然后来看看我们从设计师那里获得的所有线路。

结果可能如下所示:

Sorted

我们已经测试过,这可以正常工作,您可以从设计器中的树中删除节点,并将函数调用添加到表单加载。不要将数据保存在两个地方!!

注意:当从头开始重新创建Tree内容时,所有用户输入都将丢失。如果用户可以检查void unsortTree() { this.treeView1.Nodes.Clear(); this.treeView1.Sorted = false; System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("John"); System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Paul"); System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("George"); System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Ringo"); System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("Beatles", new System.Windows.Forms.TreeNode[] {treeNode1, treeNode2, treeNode3, treeNode4}); System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Byrds"); System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Bee Gees"); // // treeView1 // treeNode1.Name = "Knoten2"; treeNode1.Text = "John"; treeNode2.Name = "Knoten3"; treeNode2.Text = "Paul"; treeNode3.Name = "Knoten4"; treeNode3.Text = "George"; treeNode4.Name = "Knoten6"; treeNode4.Text = "Ringo"; treeNode5.Name = "Knoten0"; treeNode5.Text = "Beatles"; treeNode6.Name = "Knoten1"; treeNode6.Text = "Byrds"; treeNode7.Name = "Knoten7"; treeNode7.Text = "Bee Gees"; this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { treeNode5, treeNode6, treeNode7}); } 或编辑CheckBoxes,您应该考虑编写树形图和树状图功能! (不一定是针对文件,也许只是一个看不见的帮助树视图..)

注2:

由于Labels确实包含TreeView(但既不添加也不删除CheckBoxes也不更改Nodes),我们应该存储并恢复Texts。< / p>

在类级别添加CheckStates,这几乎是我们需要的两个递归辅助函数:

Dictionary

最后,我们在“未开始”的开头和结尾打电话给他们:

Dictionary<string, bool> tvCheckStates = null;

void storeChecks(TreeNode node)
{
    if (tvCheckStates.Keys.Contains(node.Name))
        throw new Exception("duplicate node name:" + node.Name);
    else tvCheckStates.Add(node.Name, node.Checked);

    foreach (TreeNode n in node.Nodes) storeChecks(n);
}

void restoreChecks(TreeNode node)
{
    if (tvCheckStates.Keys.Contains(node.Name))
        node.Checked = tvCheckStates[node.Name];
    else throw new Exception("node not found:" + node.Name);

    foreach (TreeNode n in node.Nodes) restoreChecks(n);
}

请注意, { if (tvCheckStates == null && treeView1.Nodes.Count > 0) tvCheckStates = new Dictionary<string, bool>(); else if (treeView1.Nodes.Count > 0) tvCheckStates.Clear(); foreach (TreeNode node in treeView1.Nodes) storeChecks(node); //.. //.. if (tvCheckStates != null && treeView1.Nodes.Count > 0) foreach (TreeNode node in treeView1.Nodes) restoreChecks(node); } 必须唯一(正如他们所希望的那样)。

要在程序运行期间保持状态,应该足以保存已检查节点的名称。

enter image description here