带有Checked Nodes递归的WinForms TreeView

时间:2018-04-07 01:04:59

标签: c# winforms treeview

我正在努力思考我认为应该是我的Treeview的基本递归,但我似乎无法使逻辑正确。

基本上我有一个WinForms Treeview(C#Net Framework 4.5.1),它有一个节点列表,这些节点是标准节点(没有自定义控件),每个节点都启用了复选框。

它是一个动态树视图,因此节点不是固定长度的深度,但基本上可以有任意数量的子节点,也可以有更多的子节点(希望这是有意义的。)

我想要实现的是返回顶级已检查节点,如果所有子节点都被选中,或者如果没有选中所有子节点,则返回已检查节点列表。

以下是一些例子: -

  • 节点1(X)
    • 节点2(X)
      • 节点3(X)
      • 节点4(X)
      • 节点5(X)

此示例将返回节点1,因为它的所有子节点(和后续子节点)都已被检查

  • 节点1(X)
    • 节点2(X)
      • 节点3(X)
      • 节点4
      • 节点5(X)

这将返回节点1 /节点2 /节点3 /节点5

  • 节点1(X)
    • 节点2(X)
      • 节点3
      • 节点4
      • 节点5(X)
        • 节点6(X)
        • 节点7(X)

这将返回节点1 /节点2 /节点5

  • 节点1(X)
    • 节点2(X)
      • 节点3
      • 节点4(X)
      • 节点5(X)
        • 节点6
        • 节点7(X)

这将返回节点1 /节点2 /节点4 /节点5 /节点7

任何帮助都将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:0)

Deacon Kelly,您可以使用此方法。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestingApplication
{
    public partial class frmTreeView : Form
    {
        TreeView tr = new TreeView();
        TreeNode tn = new TreeNode();
        TreeNode tn1 = new TreeNode();

        public frmTreeView()
        {
            InitializeComponent();
        }

        private void frmTreeView_Load(object sender, EventArgs e)
        {
            tr.CheckBoxes = true;
            tn.Text = "fruit";
            tn1.Text = "snack";
            tn1.Nodes.Add("meat");
            tn1.Nodes.Add("other");
            tn.Nodes.Add("apple");
            tn.Nodes.Add("orange");
            this.tr.Nodes.Add(tn);
            this.tn.Nodes.Add(tn1);
            this.Controls.Add(tr);
            this.tr.NodeMouseClick += new TreeNodeMouseClickEventHandler(tr_NodeMouseClick);
        }

        private void tr_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            TreeNode clickedNode = e.Node;
            if (clickedNode.Checked)
            {
                if (clickedNode.Text.Equals("apple"))
                {
                    MessageBox.Show("you checked" + clickedNode.Text + "");
                }
                else if (clickedNode.Text.Equals("orange"))
                {
                    MessageBox.Show("you checked" + clickedNode.Text + "");
                }
            }
        }

    }
}