我的Windows窗体用户界面中有一个TreeView。 我想从数据库中填充它,但它不会刷新,即使我写了每个节点的WriteLine(),它也在我期望的内存中。
为了让它更容易理解,我写了一个小例子程序,它只有一个创建TreeView的按钮和一个名为treeView1的TreeView来显示它的内容。
如果有人能告诉我在哪里误解了TreeView的使用,那将是一个巨大的帮助。
private void button1_Click(object sender, EventArgs e)
{
// create a tree
TreeView t = new TreeView();
TreeNode[] child = new TreeNode [1];
child[0]=new TreeNode("myCat");
child[0].Name = "IndependantOne";
TreeNode categoryNode = new TreeNode("catIdTag", child);
categoryNode.Name = "Citizen Cat 5239002147";
t.Nodes.Add(categoryNode);
// some stuff under the first node
TreeNode[] mouseNode = new TreeNode[1];
mouseNode[0] = new TreeNode("myMouse");
mouseNode[0].Name = "SqueakyOne";
TreeNode[] childItem = new TreeNode[1];
childItem[0] = new TreeNode("mouseIdTag", mouseNode);
childItem[0].Name = "Citizen Mouse 54655654649";
TreeNode eltNode = new TreeNode("Cheese", childItem);
eltNode.Name = "Emmental";
t.Nodes["Citizen Cat 5239002147"].Nodes.Add(eltNode);
// fill in the winform treeview
if (t != null)
{
//treeView1.Visible = false;
treeView1.BeginUpdate();
treeView1.Nodes.Clear();
treeView1.TopNode = t.TopNode;
foreach (TreeNode n in t.Nodes)
{
treeView1.Nodes.Add(n);
System.Diagnostics.Debug.WriteLine("Category Node contains: " + treeView1.Nodes[n.Name].Name + " at " + treeView1.Nodes[n.Name].Level);
foreach (TreeNode no in treeView1.Nodes[n.Name].Nodes)
{
System.Diagnostics.Debug.WriteLine("Category Node Nodes contains: " + no.Name);
}
}
/*
This part I tried and it doesn't work either, still add it in the question if anyone knows if it's wiser?
this.treeView1 = t;
this.treeView1.Location = new System.Drawing.Point(233, 12);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(351, 277);
this.treeView1.TabIndex = 11;
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
*/
treeView1.EndUpdate();
this.treeView1.Update();
this.treeView1.Refresh();
treeView1.Show();
//this.Refresh();
}
}
我也尝试用
设置treeView1 treeView1 = t;
这不成功......
答案 0 :(得分:2)
变化
treeView1.Nodes.Add(n);
与
treeView1.Nodes.Add((TreeNode)n.Clone());
您不能在多个TreeView
控件中托管同一节点。
或者,您可以从源TreeView
中删除节点,然后再将其添加到其他TreeView
:
while(t.Nodes.Count != 0)
{
var node = t.Nodes[0];
t.Nodes.RemoveAt(0);
treeView1.Nodes.Add(node);
}
我希望您在方法中创建和填充树视图有一个真正的原因,而不是直接填充现有的树视图。如果这不是预期的行为,请完全删除if
阻止,并将TreeView t = new TreeView();
更改为var t = treeView1
。
答案 1 :(得分:1)
这种行为是预期的,因为使用此代码,您会混淆本机.NET树视图控件的节点到树视图关系的性质。相反,当在树视图(t - > treeView1)之间移动节点时,您需要按照建议克隆它们。如果没有移动的节点仍然与旧的树视图链接(请参阅node.Treeview属性),并且因为原始树(t)不可见/添加到任何父(窗体),我猜节点将是不可见的好。
此外,您处理数据加载(通过创建新的树视图)的方式非常糟糕。相反,您需要将数据(我猜测为异步)下载到临时缓冲区中,并在使用BeginUpdate / EndUpdate调用提供数据时立即重新创建treeView1。
PS。用't'替换treeView1 变量将不起作用,因为您没有使用此代码替换父窗体/面板控件属性中的树视图控件实例。 / p>