Winforms treeview, рекурсивно проверить проблему дочерних узлов - PullRequest
15 голосов
/ 04 июля 2010

Следующий код взят непосредственно от Microsoft по адресу http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.aftercheck%28VS.80%29.aspx.

  // Updates all child tree nodes recursively.
  private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
  {
   foreach (TreeNode node in treeNode.Nodes)
   {
    node.Checked = nodeChecked;
    if (node.Nodes.Count > 0)
    {
     // If the current node has child nodes, call the CheckAllChildsNodes method recursively.
     this.CheckAllChildNodes(node, nodeChecked);
    }
   }
  }

  // NOTE   This code can be added to the BeforeCheck event handler instead of the AfterCheck event.
  // After a tree node's Checked property is changed, all its child nodes are updated to the same value.
  private void node_AfterCheck(object sender, TreeViewEventArgs e)
  {
   // The code only executes if the user caused the checked state to change.
   if (e.Action != TreeViewAction.Unknown)
   {
    if (e.Node.Nodes.Count > 0)
    {
     /* Calls the CheckAllChildNodes method, passing in the current 
     Checked value of the TreeNode whose checked state changed. */
     this.CheckAllChildNodes(e.Node, e.Node.Checked);
    }
   }
  }

. Вы помещаете его в форму, содержащую древовидную структуру, и вызываете node_AfterCheck для (удивления, удивления) события TreeCheck в виде древовидной структуры.Затем он рекурсивно проверяет или снимает флажки дочерних узлов в древовидном представлении.

Однако, если вы на самом деле попробуете это сделать, и достаточно быстро несколько раз щелкните на одном и том же флажке древовидного представления, дочерние узлы в конечном итоге получат свои проверки из-синхронизация с родителем.Вероятно, вам понадобится пара уровней с общим числом, возможно, 100 детей, чтобы обновление пользовательского интерфейса было достаточно медленным, чтобы заметить, что это происходит.

Я пробовал несколько вещей (например, отключение элемента управления treeviewв начале node_AfterCheck и повторное включение в конце), но проблема с синхронизацией все еще возникает.

Есть идеи?

1 Ответ

33 голосов
/ 04 июля 2010

Класс .NET TreeView в значительной степени настраивает обработку мыши для собственного элемента управления Windows, чтобы синтезировать события до и после.К сожалению, они не совсем поняли.Когда вы начнете нажимать быстро, вы будете генерировать сообщения двойного щелчка.Собственный элемент управления реагирует на двойной щелчок, переключая проверенное состояние элемента, , не сообщая об этом .NET wrapper .Вы не получите событие Before / AfterCheck.

Это ошибка, но они не исправят ее.Обходной путь не сложный, вам нужно предотвратить просмотр двойного щелчка родным элементом управления.Добавьте новый класс в ваш проект и вставьте код, показанный ниже.Компиляция.Удалите новый элемент управления из верхней части панели инструментов, заменив существующий.

using System;
using System.Windows.Forms;

class MyTreeView : TreeView {
    protected override void WndProc(ref Message m) {
        // Filter WM_LBUTTONDBLCLK
        if (m.Msg != 0x203) base.WndProc(ref m);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...