这个很难解释,所以我只会告诉你我想要实现的目标以及我是如何做到的,所以也许有人会知道我做错了什么。
在我的 winForm 中,我有一个我填充的 TreeView 控件。所有 parent 都有 child (任何数量),但没有 child 有自己的 child 。示例:
- Parent 1
Child 1
Child 2
Child 3
- Parent 2
Child 4
我想要的行为如下:
- 当用户点击一个 child 时,它会被选中(默认完成)
- 当用户点击父项时,它应该折叠或展开但不改变任何选择
第 1 点没有问题,因为它是 TreeView 的默认行为,但第 2 点是另一回事。
这是我到目前为止所做的:
为了防止选择父级,我添加了一个 BeforeSelect 事件处理程序并在其中放入以下代码:
if (e.Node.Parent == null)
e.Cancel = true;
这完美地完成了工作。所以现在我取消了我想展开或折叠它的 parent 的选择。所以我把上面的代码改成了:
if (e.Node.Parent == null)
{
if (e.Node.IsExpanded)
{
e.Node.Collapse();
}
else
{
e.Node.Expand();
}
e.Cancel = true;
}
这有点管用 - 除了与单击 + 号不同的是,调用 Expand() 或 Collapse() 会选择父节点,而忽略 e.Cancel = true;行。
我尝试在调用 Collapse() 或 Expand() 之前获取 SelectedNode,然后将其设置回去 - 它有效,但当我这样做时,它会再次展开父节点以进行选择。
不知何故,当我点击一个父级时,+ 号完全符合我想要发生的事情 - 我似乎无法让它工作。
想法?
提前致谢
最佳答案
试试这个:
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;
}
}
}
关于C# TreeView 在父级选择上折叠/展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10126873/