C# TreeView свернуть / развернуть на родительском select
Это трудно объяснить, поэтому я просто расскажу вам, чего я хочу достичь и как я это делаю, так что, возможно, у кого-то будет идея о том, что я делаю неправильно.
В моей 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 (), а затем установить его обратно - это работает, но когда я это сделаю, он снова развернет родительский объект, чтобы сделать выбор.
Где-то знак + делает именно то, что я хочу, чтобы произошло, когда я нажимаю на родителя-я просто не могу заставить его работать.
Идеи?
Заранее спасибо
1 ответ:
Попробуйте это:
private bool allowExpandCollapse = false; private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) { e.Cancel = !allowExpandCollapse; } private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e) { e.Cancel = !allowExpandCollapse; } private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) { if (e.Node.Parent == null) { e.Cancel = true; } } private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Node.Parent == null) { allowExpandCollapse = true; if (e.Node.IsExpanded) { TreeNode selectedNode = treeView1.SelectedNode; e.Node.Collapse(); allowExpandCollapse = false; treeView1.SelectedNode = selectedNode; } else { e.Node.Expand(); allowExpandCollapse = false; } } }