C# 如何删除未选择的treeview节点
如何删除未选择的treeview节点。即使我循环了两次,在删除所有未选中的树节点之前,仍然需要单击按钮三次。 这就是我们所拥有的:C# 如何删除未选择的treeview节点,c#,treeview,C#,Treeview,如何删除未选择的treeview节点。即使我循环了两次,在删除所有未选中的树节点之前,仍然需要单击按钮三次。 这就是我们所拥有的: private void buttonShowSelected_Click(object sender, EventArgs e) { for (int i = 0; i < treeViewFilter.Nodes.Count; i++) {
private void buttonShowSelected_Click(object sender, EventArgs e)
{
for (int i = 0; i < treeViewFilter.Nodes.Count; i++)
{
DeleteUnselectedNodes();
}
}
private void DeleteUnselectedNodes()
{
for (int i = 0; i < treeViewFilter.Nodes.Count; i++)
{
TreeNode aNode = treeViewFilter.Nodes[i];
treeViewFilter.SelectedNode = aNode.FirstNode;
if (!aNode.Checked)
{
treeViewFilter.Nodes.Remove(aNode);
}
}
}
private void按钮showselected\u单击(对象发送者,事件参数e)
{
对于(int i=0;i
您应该递归地遍历树
private void buttonShowSelected_Click(object sender, EventArgs e)
{
var nodes = new List<TreeNode>(treeViewFilter.Nodes.Cast<TreeNode>());
foreach (var treeNode in nodes)
{
DeleteUnselectedNodes(treeNode);
}
}
private void DeleteUnselectedNodes(TreeNode node)
{
var nodes = new List<TreeNode>(node.Nodes.Cast<TreeNode>());
foreach (var treeNode in nodes)
{
DeleteUnselectedNodes(treeNode);
}
if (!node.Checked)
{
var parent = node.Parent;
if (parent != null) //If it isn't root
{
parent.Nodes.Remove(node);
}
else
{
treeViewFilter.Nodes.Remove(node);
}
}
}
private void按钮showselected\u单击(对象发送者,事件参数e)
{
var nodes=新列表(treeViewFilter.nodes.Cast());
foreach(节点中的var treeNode)
{
删除未选择的节点(treeNode);
}
}
私有void DeleteUnselectedNodes(TreeNode节点)
{
var nodes=新列表(node.nodes.Cast());
foreach(节点中的var treeNode)
{
删除未选择的节点(treeNode);
}
如果(!node.Checked)
{
var parent=node.parent;
if(parent!=null)//如果它不是根
{
parent.Nodes.Remove(节点);
}
其他的
{
treeViewFilter.Nodes.Remove(节点);
}
}
}
您的循环不会检查任何子节点。递归函数或堆栈可以工作:
var nodes = new Stack<TreeNode>(treeViewFilter.Nodes.Cast<TreeNode>());
while (nodes.Count > 0) {
var n = nodes.Pop();
if (!n.Checked) {
if (n.Parent != null) {
n.Parent.Nodes.Remove(n);
} else {
treeViewFilter.Nodes.Remove(n);
}
} else {
foreach (TreeNode tn in n.Nodes) {
nodes.Push(tn);
}
}
}
var nodes=新堆栈(treeViewFilter.nodes.Cast());
而(nodes.Count>0){
var n=nodes.Pop();
如果(!n.选中){
如果(n.Parent!=null){
n、 Parent.Nodes.Remove(n);
}否则{
treeViewFilter.Nodes.Remove(n);
}
}否则{
foreach(n.Nodes中的树节点tn){
节点推送(tn);
}
}
}
这不起作用。现在没有删除treeview节点。我刚刚测试过它。这不会有问题。三个节点都未选中的TreeView控件,没有子节点,您的代码将删除节点1和3,节点2仍然存在。@LarsTech,这是真的,谢谢。我更新了答案。。。尝试选中一个父节点,取消选中两个子节点。它只删除一个子节点。