Следующий код взят непосредственно от 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 и повторное включение в конце), но проблема с синхронизацией все еще возникает.
Есть идеи?