【问题标题】:How to display TreeView items to ListView Items in C#如何在 C# 中将 TreeView 项目显示到 ListView 项目
【发布时间】:2015-12-17 09:52:50
【问题描述】:

我在我的 Windows 应用程序和带有复选框的树视图中有树视图,我有一些“父节点”和一些“子节点”,我想一次检查和取消选中父节点和子节点点击“全选”和“取消全选”按钮...我应该怎么做?

现在,如果我点击特定的父节点以及子文件夹,它应该显示在列表视图中!

在此处输入代码

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();
        }
    }
}

【问题讨论】:

  • 当您选中/取消选中父节点时,默认情况下会选中/取消选中子节点。使用 Button 时,您需要做的就是选中/取消选中代码,无论是根节点还是选定节点。你想在 ListView 中究竟发生什么?一个节点,子节点,应该怎么看。目前还不清楚!
  • @TaW ... 实际上,如何以编程方式选择所有父节点和子节点?在检查父节点中的任何节点后,它应该将其显示到 listView
  • 使用复选框,如果我在父复选框上选择它应该选择父节点以及子节点,并且那些选定的节点应该导出到列表视图中......
  • 只有一个节点可以被选中。例如:`treeView1.SelectedNode = treeView1.Nodes[1];. To check: treeView1.Nodes[1].Checked = true;` 你没有告诉列表视图应该包含什么。请(更)更明确!!!
  • @TaW... Listview 不包含任何内容,我们只需将其导出到 ListView 即可!如果我要选择应该显示在列表视图上的选定节点!

标签: c# winforms treeview


【解决方案1】:

一种方法是您可以为TreeViewAfterSelect 事件创建事件处理程序。

类似的东西

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
    }            
}

我已经扩展了代码,以便您有更好的想法。希望它可能会有所帮助。

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

【讨论】:

  • @SantoshKokatnur 我已经扩展了代码以进一步澄清......我相信足以让你明白这一点。
  • after_select listview1.items.add(trvMeals.SelectedNode.Text);当我再次点击复选框时它会重复
  • 但是在您的代码中,_AfterSelect 似乎是空的,先生。私人无效trvMeals_AfterSelect(对象发送者,TreeViewEventArgs e){}
  • private void trvMeals_AfterSelect(object sender, TreeViewEventArgs e) { listView1.Items.Add(trvMeals.SelectedNode.Text); }
  • 我明白了...您的项目是否被多次添加?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多