TreeView使用技巧

http://www.cnblogs.com/luxiaoxun/p/3288003.html

节点勾选设置

TreeView树中节点勾选要求:

1、不选中一个节点,则其所有的子节点都不被选中。

2、选中一个节点,则其所有的子节点都被选中。

3、当一个节点的所有子节点都没有被选中时,该节点也没有被选中。

4、当一个节点的所有子节点中有一个被选中时,则该节点也被选中。

代码中对事件参数e.Action的判断,可以避免在改变节点的Checked的状态时,再次进入AfterCheck(),这样当在AfterCheck()中有其他逻辑响应时,可以做到每次勾选时,其他逻辑也只响应一次。

参考代码:

复制代码
        private void treeView_AfterCheck(object sender, TreeViewEventArgs e)
        {
            //通过鼠标或者键盘触发事件,防止修改节点的Checked状态时候再次进入
            if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard)
            {
                SetChildNodeCheckedState(e.Node, e.Node.Checked);
                SetParentNodeCheckedState(e.Node, e.Node.Checked);
            }
        }

        //设置子节点状态
        private void SetChildNodeCheckedState(TreeNode currNode, bool isCheckedOrNot)
        {
            if (currNode.Nodes == null) return; //没有子节点返回
            foreach (TreeNode tmpNode in currNode.Nodes)
            {
                tmpNode.Checked = isCheckedOrNot;
                SetChildNodeCheckedState(tmpNode, isCheckedOrNot);
            }
        }

        //设置父节点状态
        private void SetParentNodeCheckedState(TreeNode currNode, bool isCheckedOrNot)
        {
            if (currNode.Parent == null) return; //没有父节点返回
            if (isCheckedOrNot) //如果当前节点被选中,则设置所有父节点都被选中
            {
                currNode.Parent.Checked = isCheckedOrNot;
                SetParentNodeCheckedState(currNode.Parent, isCheckedOrNot);
            }
            else //如果当前节点没有被选中,则当其父节点的子节点有一个被选中时,父节点被选中,否则父节点不被选中
            {
                bool checkedFlag = false;
                foreach (TreeNode tmpNode in currNode.Parent.Nodes)
                {
                    if (tmpNode.Checked)
                    {
                        checkedFlag = true;
                        break;
                    }
                }
                currNode.Parent.Checked = checkedFlag;
                SetParentNodeCheckedState(currNode.Parent, checkedFlag);
            }
        }
复制代码

TreeView隐藏部分节点

WinForm中的TreeView没法根据每个节点的情况设置是否有checkbox,只能用CheckBoxes设置整个树是否有Checkbox,可通过如下方式隐藏部分节点的checkbox。

this.treeView1.CheckBoxes = true;
this.treeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll;
this.treeView1.DrawNode += new DrawTreeNodeEventHandler(treeView1_DrawNode);

隐藏节点:

复制代码
        void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
        {
            //隐藏节点前的checkbox
            if (e.Node.Level == 0 || e.Node.Level == 1)
                HideCheckBox(this.treeView1, e.Node);
            e.DrawDefault = true;
        }

        [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]
        private struct TVITEM
        {
            public int mask;
            public IntPtr hItem;
            public int state;
            public int stateMask;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string lpszText;
            public int cchTextMax;
            public int iImage;
            public int iSelectedImage;
            public int cChildren;
            public IntPtr lParam;
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam);

        private const int TVIF_STATE = 0x8;
        private const int TVIS_STATEIMAGEMASK = 0xF000;
        private const int TV_FIRST = 0x1100;
        private const int TVM_SETITEM = TV_FIRST + 63;

        private void HideCheckBox(TreeView tvw, TreeNode node)
        {
            TVITEM tvi = new TVITEM();
            tvi.hItem = node.Handle;
            tvi.mask = TVIF_STATE;
            tvi.stateMask = TVIS_STATEIMAGEMASK;
            tvi.state = 0;
            SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
        }
复制代码

TreeView递归加载节点

C#遍历指定文件夹下所有子文件夹及文件并添加到目录树:

复制代码
    private void Form1_Load(object sender, EventArgs e)
        {
            TreeNode root = new TreeNode();
           //根目录名称
            root.Text = "目录";
           //根目录路径
            GetFiles(@"E:\Tools", root);
            treeView1.Nodes.Add(root);
        }

        private void GetFiles(string filePath, TreeNode node)
        {
            DirectoryInfo folder = new DirectoryInfo(filePath);
            node.Text = folder.Name;
            node.Tag = folder.FullName;
            
            FileInfo[] chldFiles = folder.GetFiles("*.*");
            foreach (FileInfo chlFile in chldFiles)
            {
                TreeNode chldNode = new TreeNode();
                chldNode.Text = chlFile.Name;
                chldNode.Tag = chlFile.FullName;
                node.Nodes.Add(chldNode);
            }

            DirectoryInfo[] chldFolders = folder.GetDirectories();
            foreach (DirectoryInfo chldFolder in chldFolders)
            {
                TreeNode chldNode = new TreeNode();
                chldNode.Text = folder.Name;
                chldNode.Tag = folder.FullName;
                node.Nodes.Add(chldNode);
                GetFiles(chldFolder.FullName, chldNode);
            }
        }
复制代码

 

 

 

作者: 阿凡卢
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TreeView控件是Windows Forms中的一个控件,它用于显示层次结构数据,如文件夹结构、组织机构和分类目录等。TreeView控件提供了一种简单而有效的方式来显示和管理这些数据。以下是TreeView控件的使用详解: 1. 添加TreeView控件到窗体 在Visual Studio的工具箱中找到TreeView控件,并将其拖放到窗体上。 2. 设置TreeView控件的属性 TreeView控件有许多可用的属性,可以在属性窗口中进行设置。其中一些常用的属性包括: - Nodes:TreeView控件中的节点集合。 - ImageList:用于显示节点图像的ImageList控件。 - CheckBoxes:指示是否显示节点前面的复选框。 - ShowLines:指示是否显示节点之间的连接线。 - ShowPlusMinus:指示是否显示展开和折叠节点的加号和减号。 - SelectedNode:表示当前选定的节点。 3. 添加节点 可以使用Nodes属性中的Add方法来添加节点。例如,以下代码将在TreeView控件中添加一个名为“根节点”的节点: ``` c# treeView1.Nodes.Add("根节点"); ``` 可以在节点上使用Text属性来设置节点的文本。例如,以下代码将设置根节点的文本为“根节点”: ``` c# treeView1.Nodes[0].Text = "根节点"; ``` 可以使用Nodes属性的Add方法来添加子节点。例如,以下代码将在根节点下添加一个名为“子节点”的子节点: ``` c# treeView1.Nodes[0].Nodes.Add("子节点"); ``` 可以使用TreeView控件的SelectedNode属性来获取或设置当前选定的节点。例如,以下代码将选定根节点: ``` c# treeView1.SelectedNode = treeView1.Nodes[0]; ``` 4. 设置节点图像 可以使用ImageList控件来为节点设置图像。首先,需要将ImageList控件添加到窗体上,并设置其ImageSize属性。然后,可以将图像添加到ImageList控件中。例如,以下代码将设置TreeView控件节点的图像: ``` c# // 创建一个ImageList控件 ImageList imageList = new ImageList(); // 设置ImageSize属性 imageList.ImageSize = new Size(16, 16); // 添加图像 imageList.Images.Add("folder", Image.FromFile("folder.png")); // 将ImageList控件赋给TreeView控件的ImageList属性 treeView1.ImageList = imageList; // 在节点上设置图像 treeView1.Nodes[0].ImageKey = "folder"; ``` 5. 处理节点事件 TreeView控件提供了许多事件,可以在事件处理程序中执行自定义代码。例如,以下代码将在单击节点时显示节点的文本: ``` c# private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { MessageBox.Show(e.Node.Text); } ``` 6. 总结 以上就是TreeView控件的使用详解。TreeView控件是一个非常实用的控件,可以用来显示层次结构数据,如文件夹结构、组织机构和分类目录等。使用TreeView控件,可以轻松地添加、删除和修改节点,以及处理节点事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值