Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中显示TreeView项到ListView项#_C#_Winforms_Treeview - Fatal编程技术网

C# 如何在C中显示TreeView项到ListView项#

C# 如何在C中显示TreeView项到ListView项#,c#,winforms,treeview,C#,Winforms,Treeview,我在我的windows应用程序中有树状视图,在树状视图中有复选框,我有一些“父节点”和一些“子节点”,我想在单击“全部选中”和“全部取消选中”按钮时一次选中和取消选中父节点和子节点。。。我该怎么做 现在,如果我单击特定的父节点以及子文件夹,它应该会显示在listview中 在这里输入代码 namespace howto_treeview_select_subtree { public partial class Form1 : Form { public Form

我在我的windows应用程序中有树状视图,在树状视图中有复选框,我有一些“父节点”和一些“子节点”,我想在单击“全部选中”和“全部取消选中”按钮时一次选中和取消选中父节点和子节点。。。我该怎么做

现在,如果我单击特定的父节点以及子文件夹,它应该会显示在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
    }            
}
private void updateChildrenNodes(TreeNode节点,bool已检查)//递归调用
{
node.Checked=isChecked;
如果(node.Nodes.Count>0)//有子级,则执行递归调用
foreach(node.Nodes中的TreeNode childNode)
updateChildrenNodes(childNode,已检查);
}
私有无效树视图1_检查后(对象发送方,树视图目标e)
{
TreeView视图=作为TreeView的发件人;
TreeNode节点=view.SelectedNode;
bool isChecked=node.Checked;
updateChildrenNodes(节点,已检查);
}
List checkedNodes=新列表();
私有void treeView1_AfterSelect(对象发送方,treeviewventargs e)
{
TreeView TreeView=作为TreeView的发件人;
listView1.Clear();//重置所有节点
nodes.Clear();//清除列表
//从TreeView中获取所需内容,检查TreeNode是否已检查
//通过递归调用将选中的节点放入checkedNodes列表,执行相同的技巧
foreach(checkedNodes中的TreeNode checkedNode)
{
//要执行某些操作,请使用此信息放入listView1
}            
}
我已经扩展了代码,以便您有更好的想法。希望能有所帮助


注意:我还没有彻底检查代码,因为它可能需要一些时间,但我相信这应该足以让您获得必要的工具来使用,以及基本思想。

默认情况下,当您选中/取消选中父节点时,会选中/取消选中子节点。使用按钮时,只需在代码中选中/取消选中根节点或所选节点。您希望在ListView中发生什么?一个节点,子节点,它应该是什么样子。目前还不清楚@陶。。。实际上,如何按进度选择所有父节点和子节点?在选中父节点中的任何节点后,它应该使用复选框将其显示在listview中,如果在父复选框中选择,它应该选择父节点以及子节点,并且这些选定的节点应该导出到listview中…只能选择一个节点。例如:`treeView1.SelectedNode=treeView1.Nodes[1]<代码>。要检查:treeView1.Nodes[1]。Checked=true;`您没有告诉listview应该包含什么。请(更加)明确@陶。。。Listview不包含任何内容,我们只需要将其导出到Listview!如果要选择应显示在listview上的选定节点@SantoshKokatnur我已经扩展了代码以进一步澄清。。。我相信这对你来说已经足够了。选择listview1.items.add(trvMeals.SelectedNode.Text)之后;当我再次点击复选框时,它重复了一遍,但在您的代码中,\u AfterSelect似乎是空的,先生。private void trvMeals_AfterSelect(object sender,treevieventergs e){}private void trvMeals_AfterSelect(object sender,treevieventergs e){listView1.Items.Add(trvMeals.SelectedNode.Text);}我看到了。。。您的物品是否添加了多次?