Это сложно объяснить, поэтому я просто расскажу вам, чего я хочу достичь и как я это делаю, так что, возможно, у кого-то будет представление о том, что я делаю неправильно.
В моей winForm у меня есть элемент управления TreeView, который я заполняю. У всех родителей есть дети (их любое количество), но ни у одного из них нет собственных детей. Пример:
- Parent 1
Child 1
Child 2
Child 3
- Parent 2
Child 4
Я хочу следующее поведение:
- когда пользователь щелкает дочерний элемент, он выбирается (по умолчанию)
- Когда пользователь щелкает родительский элемент, он должен либо свернуться, либо развернуться, но не изменить выделение.
Точка 1 не проблема, поскольку это поведение TreeView по умолчанию, точка 2 - это совсем другая история.
Вот что я сделал до сих пор:
Чтобы предотвратить выбор родителя, я добавляю обработчик события BeforeSelect и помещаю в него следующий код:
if (e.Node.Parent == null)
e.Cancel = true;
Это отлично справляется со своей задачей. Итак, теперь, когда я отменил выбор родителя, я хочу развернуть или свернуть его. Поэтому я изменил приведенный выше код на:
if (e.Node.Parent == null)
{
if (e.Node.IsExpanded)
{
e.Node.Collapse();
}
else
{
e.Node.Expand();
}
e.Cancel = true;
}
Это отчасти работает - за исключением того, что, в отличие от щелчка по знаку +, вызов Expand () или Collapse () делает родительский узел выбранным, игнорируя e.Cancel = true; линия.
Я попытался получить SelectedNode перед вызовом Collapse () или Expand (), а затем вернуть его обратно - он работает, но когда я это сделаю, он снова расширит родительский элемент, чтобы сделать выбор.
Каким-то образом знак + делает именно то, что я хочу, когда я нажимаю на родителя - я просто не могу заставить его работать.
Идеи?
заранее спасибо