Treeview не обновляется, чтобы показать дочерний узел, перемещенный из одного родительского узла в другой - PullRequest
1 голос
/ 23 марта 2010

Я использую класс Windows Forms TreeView, который содержит набор TreeNode s. У TreeNode s могут быть дочерние узлы.

У меня есть корневой узел с 2 подузлами (Node1 и Node2)

Узел1 имеет 2 подузла (child1 и child2)

У меня есть функция, которая позволит пользователю выбрать любой узел и переместить его на другой узел:

TreeNode SelectNode = this.TreeView1.SelectedNode;
TreeNode DestNode = SelectedNewNode();  //function to select a new node
SelectedNode.Remove();
DestNode.Nodes.Add(SelectedNode);
this.TreeView1.Refresh();

Когда это выполняется, текущий выбранный узел (child2) удаляется из его текущего родителя. (Node1) и добавлен к Node2.

Однако метод Refresh() элемента управления TreeView не показывает, что child2 находится под Node2. Если я отлаживаю его и смотрю на коллекцию Nodes в TreeView, я вижу, что child2 находится под Node2.

Может кто-нибудь сказать мне, почему метод Refresh() не перерисовывает нового родителя в дочернее сопоставление? Есть ли способ указать TreeView перерисовать с новыми сопоставлениями?

1 Ответ

1 голос
/ 23 марта 2010

Я не знаю, является ли это опечаткой или нет, но в первой строке вы ссылаетесь на SelectNode, а затем позже добавляете что-то под названием SelectedNode.Это могут относиться к различным переменным / свойствам.

В противном случае, либо есть проблема с вашей SelectedNewNode функцией, либо этот код выполняется в какой-то длительной синхронной операции и перерисовки не происходит вообще,Вам не нужен метод Refresh вообще;когда вы вызываете метод Remove() для TreeNode, отображение обновляется, а когда вы Add обращаетесь к другому родителю, оно снова обновляется.Удалите вызов Refresh.

Если вы действительно пытаетесь выполнить обновление во время длительной операции, вам нужно вызвать Invalidate, а затем Update.Однако, если это не находится в цикле или блокирующем вызове где-то, это будет бессмысленно.

Есть еще одна возможность, которая заключается в том, что вы вызвали метод TreeView.BeginUpdate и забыли вызвать TreeView.EndUpdate, что препятствует отображению обновлений.

Просто чтобы проверить это, я проверил это на новой форме Windows с добавлением TreeView двух корней (Node0 и Node1) и одногоребенок каждому (Node2 и Node3).Следующий код успешно обновляет отображение TreeView:

TreeNode nodeToMove = treeView1.Nodes.Find("Node3", true).First();
TreeNode newParent = treeView1.Nodes.Find("Node0", false).First();
nodeToMove.Remove();
newParent.Nodes.Add(nodeToMove);

Если ни одно из приведенных выше предложений не решит вашу проблему, то начните с этого рабочего примера и посмотрите на разницу между рабочим примером и вашим текущимкод.

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