Почему TreeView неожиданно рухнул в WinForms? - PullRequest
4 голосов
/ 21 июля 2009

Что может вызвать падение TreeView, кроме вызова метода .Collapse () на TreeNode или метода .CollapseAll () TreeView?

В приложении, которое я разрабатываю, TreeView просто не будет работать должным образом. TreeView поддерживает только два уровня. При выборе дочернего узла родительского узла все остальные узлы немедленно сворачиваются. Однако в моем коде нет никаких вызовов методов .Collapse () или .CollapseAll ()!

Все свойства TreeView имеют значения по умолчанию, кроме свойства .LabelEdit, для которого установлено значение true. TreeView имеет некоторый код, связанный с событием AfterLabelEdit для простой процедуры проверки / MessageBox.

Я пробовал:

  • Перехват события BeforeCollapse для TreeView и повышение e.CancelAction флаг.

  • Расширение всех узлов вручную в AfterSelect TreeView событие. (Это прекрасно работает как эксперимент, но я не собираюсь запретить коллапс узла
    в целом!)

Во многих точках кода я перебираю TreeView, узел за узлом, чтобы проверить свойства. Однако никаких добавлений или удалений узлов не происходит. Единственные свойства TreeNode, которые изменяются при выборе пользователем, - это .ImageIndex и .SelectedImageIndex.

Кроме двух приведенных выше решений, я не имею ни малейшего представления о том, что может быть причиной этой ошибки. Даже если никакие решения не могут быть реализованы, может ли кто-нибудь иметь представление о правильном способе захвата краха? (Я попытался установить точку останова в событии BeforeCollapse, но она не сработала, если пользователь явно не свернул узел с помощью мыши или клавиатуры.)


UPDATE:

Проблема связана с изменением свойства .SelectedImageIndex на любом TreeNode. Изменение этого свойства приводит к разрушению всех остальных узлов.

Я попытался окружить код модификации свойства .SelectedImageIndex вызовами .BeginUpdate () и .EndUpdate (), но безрезультатно.

Как этого избежать?

1 Ответ

10 голосов
/ 22 июля 2009

Это побочный эффект работы родных окон в Windows. Многие параметры окна задаются флагами стиля в вызове CreateWindowEx (). Основные вещи, например, как выглядит граница на форме. Какой вид ViewView должен иметь. Должен ли TreeView отображать флажки.

Эти стили отображаются как свойства в элементе управления. Но есть проблема. Изменение такого свойства требует воссоздания окна с нуля, чтобы в вызове CreateWindowEx () можно было указывать новые флаги стиля. У этого есть побочные эффекты, окно полностью воссоздано, таким образом, оно теряет все предыдущее состояние.

Windows Forms довольно хорошо справляется с этим, восстанавливая предыдущее состояние после воссоздания окна. Но это есть утечки здесь и там. И несколько откровенных ошибок. Одна утечка в TreeView - это точное состояние, какие узлы свернуты, а какие нет. Отслеживать это просто не практично.

Диагностируйте это, поместив свойство Handle TreeView в окно наблюдения. Если вы видите, что это изменится, вы нашли собственность. Список флагов стиля доступен здесь , вы, вероятно, можете сопоставить их имена с соответствующим свойством.

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

...