В представлении дерева не отображается обновление - PullRequest
2 голосов
/ 04 августа 2011

В моем пользовательском интерфейсе Windows Form есть TreeView. Я хочу заполнить его из базы данных, но он не обновляется никогда, даже если я записываю каждый узел (), он находится в памяти, как я и ожидал.

Чтобы сделать его более легким для понимания, я написал небольшой пример программы, в которой есть только одна кнопка, которая создает TreeView и TreeView с именем treeView1 для отображения его содержимого.

Если кто-нибудь скажет мне, где я неправильно понял использование 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 ]

2 голосов
/ 04 августа 2011

изменить

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 голос
/ 04 августа 2011

Такое поведение ожидается, потому что в этом коде вы путаете природу отношений между узлами и представлениями дерева в нативном элементе управления .NET treeview.Вместо этого при перемещении узлов между древовидными представлениями (t -> treeView1) необходимо клонировать их, как это предлагается.Без этого перемещенного узла, все еще связанного со старым древовидным представлением (см. Свойство node.Treeview), а также потому, что исходное дерево (t) не видно / не добавлено ни к одному из родительских элементов (формы), я думаю, узел также будет невидимым.

Кроме того, способ работы с загрузкой данных (через создание нового дерева) является довольно плохим паттерном.Вместо этого вам нужно загрузить свои данные (я полагаю, асинхронно) во временный буфер и заново создать treeView1, когда данные будут доступны при вызовах BeginUpdate / EndUpdate.

PS.Замена treeView1 переменной на 't' также не будет работать, поскольку вы не заменяете элемент управления treeview instance в родительской форме / панели управления свойством этим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...