我在我的 Windows 应用程序和带复选框的 TreeView 中有 TreeView ,我有一些“父节点”和一些“子节点”,我想一次检查和取消检查父节点和子节点单击“全部选中”和“取消全部选中”按钮...我应该怎么做?
现在,如果我单击特定的父节点和子文件夹,它应该显示在 ListView 中!
在此输入验证码
namespace howto_treeview_select_subtree
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
trvMeals.CheckBoxes = true;
foreach (TreeNode node in trvMeals.Nodes)
{
ExpandNode(node);
}
trvMeals.SelectedNode = trvMeals.Nodes[0];
foreach (TreeNode node in trvMeals.Nodes)
{
node.Checked = true;
}
}
private void ExpandNode(TreeNode node)
{
node.EnsureVisible();
foreach (TreeNode child in node.Nodes)
{
ExpandNode(child);
}
}
private void trvMeals_AfterCheck(object sender, TreeViewEventArgs e)
{
TreeNode node = e.Node;
bool is_checked = node.Checked;
foreach (TreeNode child in node.Nodes)
{
child.Checked = is_checked;
}
trvMeals.SelectedNode = node;
}
private void trvMeals_AfterSelect(object sender, TreeViewEventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
foreach (TreeNode node in trvMeals.Nodes)
{
node.Checked = true;
CheckChildren(node, true);
}
//foreach (TreeNode node in trvMeals.Nodes)
//{
// node.Checked = true;
//}
}
private void button2_Click(object sender, EventArgs e)
{
foreach (TreeNode node in trvMeals.Nodes)
{
node.Checked = false;
}
}
private void button3_Click(object sender, EventArgs e)
{
listView1.Text = (listView1 + "\n") + trvMeals.SelectedNode.Text;
//foreach (TreeNode node in trvMeals.Nodes)
//{
// RcTxt.Text = RcTxt.Text + trvMeals.SelectedNode.Text;
//}
}
private void CheckChildren(TreeNode rootNode, bool isChecked)
{
foreach (TreeNode node in rootNode.Nodes)
{
CheckChildren(node, isChecked);
node.Checked = isChecked;
}
}
private void button4_Click(object sender, EventArgs e)
{
listView1.Clear();
}
}
}
最佳答案
一种方法是为 TreeView
的 AfterSelect
事件创建事件处理程序。
像这样
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
//grab the listView object and sender as TreeView.
//grab whatever you need from the TreeView
//Put whatever you need in the listView
}
要进行检查和取消检查,为 TreeView
事件 AfterCheck
创建另一个事件处理程序。
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) {
TreeView view = sender as TreeView;
//Access the treeview nodes, check/uncheck them
}
编辑:
扩展代码:
private void updateChildrenNodes(TreeNode node, bool isChecked) //recursive call
{
node.Checked = isChecked;
if (node.Nodes.Count > 0) //has children, do recursive call
foreach (TreeNode childNode in node.Nodes)
updateChildrenNodes(childNode, isChecked);
}
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
TreeView view = sender as TreeView;
TreeNode node = view.SelectedNode;
bool isChecked = node.Checked;
updateChildrenNodes(node, isChecked);
}
List<TreeNode> checkedNodes = new List<TreeNode>();
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeView treeView = sender as TreeView;
listView1.Clear(); //reset all the nodes
nodes.Clear(); //clears the list
//grab whatever you need from the TreeView, check if the TreeNode is checked
//do the same trick by recursive call to put the checked nodes to checkedNodes list
foreach (TreeNode checkedNode in checkedNodes)
{
//do something, use this info to put in listView1
}
}
我已经扩展了代码,以便您有更好的想法。希望它能有所帮助。
注意:我没有彻底检查代码,因为它可能需要一些时间,但我相信这应该足以让您获得必要的工具和基本思想。
关于c# - 如何在 C# 中将 TreeView 项显示为 ListView 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34331494/