Windows窗体多选树视图

时间:2018-09-21 11:57:48

标签: treeview

是否可以在Windows树状视图中进行多选?类似于下图

enter image description here

我知道.NET当前没有多选树视图。它被视为win32本机Treeview控件的包装器。如果可能,我想避免使用Treeview的Checkbox属性。任何建议将不胜感激!

2 个答案:

答案 0 :(得分:2)

这个问题已经得到here的回答,但是我将简要回答您的问题。虽然本机Treeview控件确实允许多重选择,但您可以从中派生一个子类并覆盖其行为。

示例代码:

checkNodes方法:

private void checkNodes(TreeNode node, bool check)
        {
            foreach (TreeNode child in node.Nodes)
            {
                if (child.Checked == true)
                {
                    MessageBox.Show(child.Text);
                } 
                //MessageBox.Show(child.Text);
                checkNodes(child, check);
            }
        }

检查后的Treeview方法:

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
            {
                 if (busy) return;
                busy = true;
                try
                {
                    TreeNode _node = e.Node;

                    checkNodes(e.Node, e.Node.Checked);
                    if (e.Node.Checked)
                    {
                        MessageBox.Show(e.Node.Text);
                    }
                }


                finally
                {
                    busy = false;
                }
            }

        }

这样做并非易事,但是可以做到的。

答案 1 :(得分:2)

我将假设您正在尝试避免使用复选框。这是一个示例:

public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      treeView1.DrawMode = OwnerDrawText;
      treeView1.DrawNode += treeView1_DrawNode;
      treeView1.NodeMouseClick += treeView1_NodeMouseClick;
    }

    private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) {
      // Show checked nodes with an underline
      using (SolidBrush br = new SolidBrush(e.Node.TreeView.BackColor))
        e.Graphics.FillRectangle(br, e.Node.Bounds);
      Font nodeFont = e.Node.NodeFont;
      if (nodeFont == null) nodeFont = e.Node.TreeView.Font;
      if (e.Node.Checked) nodeFont = new Font(nodeFont, FontStyle.Underline);
      using (SolidBrush br = new SolidBrush(e.Node.TreeView.ForeColor))
        e.Graphics.DrawString(e.Node.Text, nodeFont, br, e.Bounds);
      if (e.Node.Checked) nodeFont.Dispose();
    }

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
      if (Control.ModifierKeys == Keys.Shift && e.Node.Parent != null) {
        // Extend selection
        bool check = false;
        foreach (TreeNode node in e.Node.Parent.Nodes) {
          if (node.Checked) check = true;
          node.Checked = check;
          if (node == e.Node) break;
        }
      }
      else {
        unselectNodes(treeView1.Nodes);
        e.Node.Checked = true;
      }
    }