Winform开发常用控件之TreeView菜单导航和权限用法

TreeView一个很棒的控件,我们在做WEB开发时常常犯困的一个东东。当然这里介绍winform里面的用法唠。

先介绍几个属性吧,CheckBoxes设置为true的话树形节点前面会出现checkbox勾选框、ImageList绑定树形里面的图标(界面上放一个Imgelist控件,绑定上即可)、ShowLines(树形展开时显示线条)等等

哦,这个方法好,this.MenutreeView.ExpandAll();即Treeview加载后全部展开。

下面先介绍一个简单的菜单用法

1、TreeView节点的设置和选取节点

TreeView静态节点的设置方法很简单,主要用在软件的快捷导航中。贴图,可以设置多级节点,每个节点设置Name和Text属性即可,如果觉得不美观,可以放一些图标。

本例中的图标是用ImageList绑定到里面的,还是比较简单。

设置好节点后,就可以写节点的事件了,贴代码

 /// <summary>
        /// 树形目录菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// AfterSelect事件是点击节点时的事件
        private void MenutreeView_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string nodeselect = MenutreeView.SelectedNode.Name;
            switch (nodeselect)
            {
                case "用户管理": ShowUsermanager(); break;
                case "竞赛项目管理": ShowItemFrm(); break;
                case "参赛单位管理": ShowDepartFrm(); break;
                case "运动员信息": ShowMemberInfoFrm(); break;
                case "代表队名单": ShowMatchTeamFrm(); break;
                case "随机分组": ShowRandomGroupFrm(); break;
                case "分组信息": ShowGroupInfoFrm(); break;
                case "评分管理": ShowPointFrm(); break;
                case "成绩管理": ShowScoreFrm(); break;
                default: break;

            }
        }

看到了吧,还是比较简单,case到以后,执行相应的方法即可,本例中主要是show一些窗口。

2、TreeView动态绑定及获取勾选值

这里介绍一个权限的示例,本例是将选中的节点放置在listbox中

上图拿到了text和name两个值

      private void BindTreeView()
        {
            treeView1.LabelEdit = false;//不可编辑
            //添加结点
            TreeNode root = new TreeNode();
            root.Text = "根节点";
            root.Name = "All";
            //一级
            TreeNode node1 = new TreeNode();
            node1.Text = "新增";
            node1.Name = "Add";
            TreeNode node2 = new TreeNode();
            node2.Text = "编辑";
            node2.Name = "Edit";
            //二级
            TreeNode node11 = new TreeNode();
            node11.Text = "新增管理员";
            node11.Name = "AddManager";
            TreeNode node12 = new TreeNode();
            node12.Text = "新增普通用户";
            node12.Name = "AddUser";
            TreeNode node21 = new TreeNode();
            node21.Text = "编辑管理员";
            node21.Name = "EditManager";
            TreeNode node22 = new TreeNode();
            node22.Text = "编辑普通用户";
            node22.Name = "EditUser";
            //二级加入一级
            node1.Nodes.Add(node11);
            node1.Nodes.Add(node12);
            node2.Nodes.Add(node21);
            node2.Nodes.Add(node22);
            //一级加入根
            root.Nodes.Add(node1);
            root.Nodes.Add(node2);
            //
            treeView1.Nodes.Add(root);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            foreach (TreeNode node in treeView1.Nodes)//实际上treeVIew1里面只有1个根节点,所以要用递归方法
            {
                SetTreeViewList(node);
            }
        }
        //递归方法
        private void SetTreeViewList(TreeNode node)
        {
            if (node.Checked)
            {
                listBox1.Items.Add(node.Text + "&" + node.Name);
            }
            if (node.Nodes.Count > 0)
            {
                foreach (TreeNode cnode in node.Nodes)
                {
                    SetTreeViewList(cnode);//递归
                }
            }
        }

由于Treeview遍历只能拿到一个根节点(这点大家可以做实验看看),因此必须使用递归才能找到其他子节点,下面再补充一点就是子节点全部选中后父节点自动选中,父节点选中后子节点全部选中

贴代码,下面这段接着上面的即可

 //勾选的事件,必须写在AfterCheck事件中
        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.ByMouse)//这句还是比较重要哦,如果没有的话就会陷入死循环
            {
                if (e.Node.Checked)
                {
                    //选中其子节点
                    setChildNodeCheckedState(e.Node, true);
                    //如果有父节点,选中其所有父节点
                    if (e.Node.Parent != null)
                    {
                        setParentNodeCheckedState(e.Node, true);
                    }
                }
                else
                {
                    //取消其子节点
                    setChildNodeCheckedState(e.Node, false);
                    //取消其所有父节点
                    if (e.Node.Parent != null)
                    {
                        setParentNodeCheckedState(e.Node, false);
                    }
                }
            }
        }
        //子节点递归
        private void setChildNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNodeCollection nodes = currNode.Nodes;
            if (nodes.Count > 0)
                foreach (TreeNode tn in nodes)
                {
                    tn.Checked = state;
                    setChildNodeCheckedState(tn, state);
                }
        }
        //父节点递归
        private void setParentNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNode parentNode = currNode.Parent;
            parentNode.Checked = state;
            if (currNode.Parent.Parent != null)
            {
                setParentNodeCheckedState(currNode.Parent, state);
            }
        }

上个图,看下效果

如此之类的做法可以直接将权限做到窗口的按钮上,然后自己写一个基类Form根据权限来判断菜单、按钮是否显示、是否可用等,所有的窗体继承自这个基类窗体就可以实现一劳永逸的权限控制了。具体示例有时间了奉上。

时间: 2024-08-29 13:14:10

Winform开发常用控件之TreeView菜单导航和权限用法的相关文章

Winform开发常用控件之Checkbox和CheckedListBox

Winform的开发基本都是基于控件事件的,也就是事件驱动型的. 多选框的放置和值的获取有很多种,这里介绍几个简单常用的方法 1.直接放置Checkbox,并获取Checkbox的值 上图 做法也非常简单,就是在form中放置多个checkbox,然后循环遍历,检查其checked没有,然后将checkbox.text拼接到一起,赋值给label,当然实际开发中,我们会将选取的值放入数据库中.上代码 private void button1_Click(object sender, EventA

Winform开发常用控件之DataGridView的简单数据绑定——自动绑定

DataGridView控件可谓是Winform开发的重点控件,对于数据的呈现和操作非常方便,DataGridView可谓是既简单又复杂.简单在于其已经集成了很多方法,复杂在于可以使用其实现复杂的数据呈现和操作. 本文是入门级培训,先介绍DataGridView的简单应用,复杂的应用在后续的博文中会一一呈上. DataGridView主要是呈现数据和数据操作的,那自然离不开数据. 首先是数据绑定,DataGridView的数据源可以是DataSet.DataTable或Ilist等,至于Data

Winform开发常用控件之ComboBox、ListBox

ComboBox就是我们常见的下拉框,对于此类控件,我们最关心的当然是数据的绑定和选择值得获取. 首先介绍个属性DropDownStyle,如果不允许ComboBox输入值,只能选择,就选DropDownList,默认是DropDown.可以试一试看看效果. 1.简单的数据加载和值选取 与前面介绍的CheckBox类似,还是在items集合中设置选择项,然后取值即可,贴图和代码 //在combobox中选择值变化中直接取选中的项,然后赋值给label private void comboBox1

DevExpress winform XtraEditor常用控件

最近在公司里面开始使用DevExpress winform的第三方控件进行开发和维护,这里整理一些常用控件的资料以便于后续查看 ComboBoxEdit 这个控件和winform自带的控件差不多,使用起来也方便,在designer页面拖拽控件之后可以直接在页面添加要显示的项目: 后台的代码控制也方便 1 cbBoxSex.Properties.Items.Add("全部"); 2 cbBoxSex.Properties.Items.Add("男"); 3 cbBox

WinForm开发-界面控件到实体,实体到界面控件自动绑定

在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动映射了呢?现在不用如此繁琐,在RDIFramework.NET开发框架的WinForm部分新增了界面控件到实体,实体到界面控件自动绑定,一句话就搞定了,非常的方便.主要是引用“RDIFramework.WinForm.Utilities.dll”dll文件,再调用下面两个方法即可: 1.实体到界面控

从零开始iOS8编程【iOS开发常用控件】

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 AlertView控件 弹出对话框: 修改HelloHaoMengZhu项目代码, 添加AlertView: -(IBAction)testAlert { NSString *str = [[NSString alloc] initWithFormat:@"Hello, %@",txtField.te

c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)

一.单元格内容的操作 *****// 取得当前单元格内容 Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index       Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); // 取得当前单元格的行 Index       Console.WriteLine(DataGridView1.CurrentCell.RowIndex); ******

IOS开发基础常用控件简介

在IOS开发中,各类控件完美的解决了开发过程中界面与交互展现的问题,使得IOS产品界面更加灵活实用,IOS常用控件的介绍如下. 1.窗口 UIWindow iPhone的规则是一个窗口,多个视图,窗口是你在app显示出来你看到的最底层,他是固定不变的,基本上可以不怎么理会,但要知道每层是怎样的架构. 2.视图 UIView, 是用户构建界面的基础,所有的控件都是在这个页面上画出来的,你可以把它当成是一个画布,你可以通过UIView增加控件,并利用控件和用户进行交互和传递数据. 窗口和视图是最基本

Windows Phone开发(11):常用控件(下)

WP控件大部分都可以从Silverlight中继承过来,这里我也只能拿一部分作演示,对于其它控件如何使用,可以参考SDK相关说明以及Silverlight SDK文档. 一.RadioButton控件. 这是一个单选控件,不用多解释,我们见得多了,N选1,控件是否被用户选中,由IsChecked属性标记.另外,要注意的一点是GroupName属性,它输入一个分组名,这个名由我们自己来取,目的也是为了分组,因为是单选,所以,一个容器中可能有N多个RadioButton控件或都有多组RadioBut