树视图未显示更新

时间:2011-08-04 11:38:16

标签: c# .net winforms treeview

我的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;

这不成功......

2 个答案:

答案 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>