我在树视图中添加了复选框,并使用了AfterSelect事件(也尝试过AfterChecked)。
我的树视图就像这样
1州
1.1城市1
1.2城市2
1.3城市3
2国家
2.1城市1
2.2城市2
2.3 City3
等
我正在尝试运行一个事件,因此当单击一个复选框时,标记会添加到一个阵列中,以备日后处理。我还需要使用它,所以如果单击一个状态,它会选择该叶子下的所有城市。
treeSections.AfterSelect += node_AfterCheck;
private void node_AfterCheck(object sender, TreeViewEventArgs e)
{
MessageBox.Show("testing");
}
如果没有层次结构,上面的代码可以在树视图上运行。但除非双击每个叶子的文本/标签,否则不要使用州和城市的树视图。
有什么想法吗?
答案 0 :(得分:4)
我建议使用TreeView.NodeMouseClick和TreeView.KeyUp事件的组合... click事件将通过事件args为您提供单击的节点,并且您可以使用当前所选节点的keyup。请按照以下示例...
//This is basic - you may need to modify logically to fit your needs
void ManageTreeChecked(TreeNode node)
{
foreach(TreeNode n in node.Nodes)
{
n.Checked = node.Checked;
}
}
private void convTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
ManageTreeChecked(e.Node);
}
private void convTreeView_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
ManageTreeChecked(convTreeView.SelectedNode);
}
}
使用给定每个事件的节点,您现在可以循环遍历该节点上的节点集合,并根据您所执行节点的已检查状态的状态对其进行修改以取消选中/取消选中。
当取消选中所有子节点时,您甚至可以非常想要取消选中父节点。如果你想要一个3状态的treenode(All Checked,Some Checked和None Checked),你必须创建它或找到一个已创建的。(/ p>
享受,祝你好运。
答案 1 :(得分:1)
您需要考虑一些代码:
此处不予考虑:
在检查时,当子节点选择强制选择父节点时(因为选择了所有其他子节点),选择了哪个节点。
可能是与此处未考虑的选择相关的其他案例。
假设:
您使用的是单节点选择模式的TreeView
只有两个深度级别,如OP的样本(不需要“重型”递归)
仅使用鼠标完成所有操作:不需要额外的操作,如键盘按键。
如果选中所有子节点,则自动检查父节点
取消选中任何子节点将取消选中已检查的父节点
检查或取消选中父节点会将所有子节点设置为相同的检查状态
...
// the current Node in AfterSelect
private TreeNode currentNode;
// flag to prevent recursion
private bool dontRecurse;
// boolean used in testing if all child nodes are checked
private bool isChecked;
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
// prevent recursion here
if (dontRecurse) return;
// set the currentNode
currentNode = e.Node;
// for debugging
//Console.WriteLine("after check node = " + currentNode.Text);
// select or unselect the current node depending on checkstate
if (currentNode.Checked)
{
treeView1.SelectedNode = currentNode;
}
else
{
treeView1.SelectedNode = null;
}
if(currentNode.Nodes.Count > 0)
{
// node with children : make the child nodes
// checked state match the parents
foreach (TreeNode theNode in currentNode.Nodes)
{
theNode.Checked = currentNode.Checked;
}
}
else
{
// assume a child node is selected here
// i.e., we assume no root level nodes without children
if (!currentNode.Checked)
{
// the child node is unchecked : uncheck the parent node
dontRecurse = true;
currentNode.Parent.Checked = false;
dontRecurse = false;
}
else
{
// the child node is checked : check the parent node
// if all other siblings are checked
// check the parent node
dontRecurse = true;
isChecked = true;
foreach(TreeNode theNode in currentNode.Parent.Nodes)
{
if(theNode != currentNode)
{
if (!theNode.Checked) isChecked = false;
}
}
if (isChecked) currentNode.Parent.Checked = true;
dontRecurse = false;
}
}
}