我试图按字母顺序显示树视图的节点,并设法通过以下方式完成它:
treeview1.Sort();
它完成排序工作。但是我希望可以选择将树视图恢复到原来的显示状态(不进行字母排序)。
on another question我看到我可以使用treeview的属性:.sorted
并将其设置为true或false但它对我没有任何作用。< / p>
我在控件中有数据,它已经在设计时设置了。
这样做的最佳方式是什么?
非常感谢提前!
答案 0 :(得分:1)
当然,从外部来源获取内容将是填充Tree
的最灵活方式,但是..
..因为树的内容已添加到设计器中,如果涉及到大量数据,最佳路径可能是通过将设计器代码移动到神奇的Unsort
函数来挽救这些数据你可以随时打电话。
好好查看表单Designer.cs
文件!在这里,您可以找到两个部分来处理TreeView
:
InitializeComponent()
带有可怕的警告,你不应该改变那里的任何东西。好吧,不要担心我们所做的就是从它复制几行到unsort函数.. 我们需要的是声明和创建节点的所有行。它们看起来像这样:
System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("John");
现在向下滚动到以
开头的部分 //
// treeView1
//
我们并不关心将Name
和Location
分配给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);
}
必须唯一(正如他们所希望的那样)。
要在程序运行期间保持状态,应该足以保存已检查节点的名称。