Отметьте или снимите отметку со всех дочерних элементов TreeViewItem - PullRequest
1 голос
/ 20 июля 2010

Мой проект - WinForms, C #.

У меня есть форма с TreeView с CheckBoxes, установленным в true.Есть несколько корневых узлов, каждый из которых имеет несколько дочерних узлов.

Я бы хотел, чтобы все дочерние узлы имели то же состояние «отмечено / выключено», что и их родительский узел.Я написал следующий обработчик событий:

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
  // return in case the event is induced by the code below
  if (e.Action == TreeViewAction.Unknown)
  {
    return;
  }
  System.Diagnostics.Debug.WriteLine(string.Format("Checked - {0}", e.Node.Checked));
  foreach (TreeNode subNode in e.Node.Nodes)
  {
    subNode.Checked = e.Node.Checked;
  }
}

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

Как сделать это более правильно?

Ответы [ 3 ]

3 голосов
/ 21 июля 2010

Это ошибка, представленная версией Vista собственного элемента управления TreeView. Он реагирует на двойной щелчок, автоматически переключая флажок. Но без вызова событий BeforeCheck и AfterCheck. Оболочка класса Windows Forms TreeView не была обновлена ​​для решения этой проблемы.

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

using System;
using System.Windows.Forms;

public class MyTreeView : TreeView {
  protected override void WndProc(ref Message m) {
    // Suppress WM_LBUTTONDBLCLK
    if (m.Msg == 0x203) { m.Result = IntPtr.Zero; }
    else base.WndProc(ref m);
  }
}
1 голос
/ 20 июля 2010

Мы добавляем таймер, который запускается / сбрасывается при нажатии.Если таймер срабатывает через 500 мс, выполняется фактический код обновления.

Это исправит быстрое нажатие после каждого.

0 голосов
/ 20 июля 2010

При быстром щелчке срабатывает событие двойного щелчка вместо одного щелчка. Поведение одного клика - это то, что изменяет статус проверки. Если вы сделали что-то, чтобы переопределить обычное поведение двойного щелчка, обязательно учтите это на дочерних узлах.

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