新建一个项目,名称为TreeViewMemo;在Form1窗体上添加控件DockManager和treelist,作为导航菜单,并可以实现左侧停靠及关闭导航菜单,关闭后用主菜单按钮打开;imageCollection为导航节点添加节点图标,xtraTabbedMdiManager作为显示打开窗体的容器;最终结果如下图:

添加引用,此处用的Oracle数据库;

using Oracle.ManagedDataAccess.Client;
using System.Reflection;

写一个方法用于调用查询系统导航菜单的结构

private string connecting = "数据库连接字符串";

private DataTable GetTable(string sql) //获取查询的返回结果集
        {
            DataTable dt = new DataTable();
            OracleConnection con = new OracleConnection(connecting);
            con.Open();
            OracleDataAdapter oda = new OracleDataAdapter(sql,con);
            oda.Fill(dt);
            con.Close();
            return dt;
        }
利用Form1的Load事件为为TreeList添加数据源,并设置Treelist的属性值,代码如下:

private void Form1_Load(object sender, EventArgs e)
        {
         /在每个打开页面上都多一个关闭的小叉子x
            this.xtraTabbedMdiManager1.ClosePageButtonShowMode = DevExpress.XtraTab.ClosePageButtonShowMode.InActiveTabPageHeader;
 //当打开的窗体大于1个的时候,可以拖拽一个处于悬浮状态,也可以拖拽回到MDI父容器中
            this.xtraTabbedMdiManager1.FloatOnDoubleClick = DevExpress.Utils.DefaultBoolean.True;
            this.xtraTabbedMdiManager1.FloatOnDrag = DevExpress.Utils.DefaultBoolean.True;
            this.xtraTabbedMdiManager1.FloatPageDragMode = DevExpress.XtraTabbedMdi.FloatPageDragMode.FullWindow;
            //获取数据库菜单
            string sql = " SELECT * FROM DP_SYSLIST order by 1";
            DataTable dt = new DataTable();
            dt = GetTable(sql);
            treeList1.DataSource = dt;
            treeList1.KeyFieldName = "SYS_ID";//父级字段名称
            treeList1.ParentFieldName = "SYS_LEVEL";//展开所有节点
            //treeList1.ExpandAll(); //展开子节点
            //treeList1.Appearance.FocusedCell.BackColor = Color.LightSteelBlue;    //焦点行颜色渐变
            // treeList1.Appearance.FocusedCell.BackColor2 = Color.SteelBlue;
            //treeList1.OptionsView.ShowHorzLines = false;     //隐藏行列边框
            //treeList1.OptionsView.ShowVertLines = false;     //隐藏垂直表格线    
            treeList1.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.None;  //隐藏焦点行边框
            treeList1.LookAndFeel.UseWindowsXPTheme = true;    //使用XP主题
            treeList1.LookAndFeel.UseDefaultLookAndFeel = true; //禁用默认外观与感觉
            treeList1.OptionsView.ShowIndicator = false;           //隐藏节点指示器面板 显示序号的地方
            treeList1.OptionsBehavior.Editable = false;  //禁止编辑
            //treeList1.TreeLineStyle = DevExpress.XtraTreeList.LineStyle.Percent50;     //设置树线的样式
            //treeList1.OptionsView.ShowColumns = false;       //隐藏列名
            treeList1.OptionsMenu.EnableColumnMenu = false;  //右键点击字段值不显示菜单
            treeList1.OptionsCustomization.AllowSort = false; //点击字段值排序
            treeList1.OptionsCustomization.AllowFilter = false; //字段值右上角的沙漏,过滤
            treeList1.Appearance.FocusedCell.BackColor = System.Drawing.Color.LightSteelBlue;  //设置选中行的背景色
           // treeList1.Appearance.FocusedCell.Options.UseBackColor = true;
            treeList1.OptionsCustomization.AllowColumnMoving = false; //禁止拖拽表头 字段值
            //treeList1.OptionsView.ShowColumns = false;             //隐藏列标头                              
            treeList1.OptionsView.ShowIndentAsRowStyle = true;             
        }

导航菜单的表结构

SYS_MODEL为窗体名称,SYS_PATH为名称空间名称,也就是项目名称;

添加一个控件dockManager,做为导航菜单,可以实现做隐藏,设置dockmanager的属性

this.dockManager1.AutoHiddenPanelShowMode = DevExpress.XtraBars.Docking.AutoHiddenPanelShowMode.MouseHover;
this.dockManager1.DockingOptions.AllowRestoreToAutoHideContainer = true;
this.dockManager1.DockingOptions.HideImmediatelyOnAutoHide = true;

点击Add Panel at Left ,添加一个dockPanel1,设置dockpanel1的属性;

this.dockPanel1.Dock = DevExpress.XtraBars.Docking.DockingStyle.Left;
this.dockPanel1.Text = "导航菜单";

将Treelist拖到dockPanel1中,设置treelist的属性

this.treeList1.Dock = System.Windows.Forms.DockStyle.Fill; 
this.treeList1.OptionsView.ShowColumns = false; //隐藏标题列头字段值

在TreeList的属性中添加一列值,作为显示导航列

并为TreeList属性SelectImageList选择刚刚添加的控件imageCollection1;

设置imageCollection1的属性,添加图标,点击Images,弹出的界面中添加图标

设置TreeLsit的GetSelectImage事件,代码如下:

private void treeList1_GetSelectImage(object sender, DevExpress.XtraTreeList.GetSelectImageEventArgs e)
        {
            if (e.Node.Expanded == false) //如果不是展开状态
            { 
                e.NodeImageIndex = 3;  //显示索引为3的图标
            }
            else   //否则为展开状态
            {
                e.NodeImageIndex = 4; //显示索引为4的图标
            }
            if (e.Node.FirstNode == null) //如果为最后一个节点,没有子节点
            {
                e.NodeImageIndex = 5;  //显示为索引5的的图标
            }
        }

最后做TreeList的DoubleClick事件,实现双击节点打开窗体,并在父容器中显示,代码如下:

private void treeList1_DoubleClick(object sender, EventArgs e)
        {
            TreeListNode clickedNode = this.treeList1.FocusedNode;
            if (clickedNode.FirstNode == null)
            {
                try
                {
                    string strFunNo = clickedNode.GetValue("SYS_MODEL").ToString();
                    //string path = Assembly.GetExecutingAssembly().GetName().Name; //获取命名空间名称
                    string path= clickedNode.GetValue("SYS_PATH").ToString();
                    string name = path + "." + strFunNo;
                    //Assembly assembly = Assembly.GetExecutingAssembly();
                    // 实例化窗体,利用反射打开窗体
                   // Form form = assembly.CreateInstance(name) as Form;

Form form = Assembly.Load(path).CreateInstance(name) as Form;
                    // form.Show();
                    //判断窗体是否打开,打开则跳转,未打开则打开
                    bool flag = false;
                    foreach (Form form2 in base.MdiChildren)
                    {
                        bool flag2 = form.Name == form2.Name;
                        if (flag2)
                        {
                            form2.Activate();
                            flag = true;
                            form.Dispose();
                            break;
                        }
                    }
                    bool flag3 = !flag;
                    if (flag3)
                    {
                        form.MdiParent = this;
                        form.FormBorderStyle = FormBorderStyle.None;
                        form.Dock = DockStyle.Fill;
                        form.Show();
                    }
                }
                catch
                {
                    MessageBox.Show("当前菜单没有启用");
                }
            }
        }

//重新加载菜单的代码
        private void ResToolStripMenuItem_Click(object sender, EventArgs e)
        { 
            treeList1.CollapseAll();//折叠全部节点
            //重新加载的菜单
            string sql = " SELECT * FROM DP_SYSLIST order by 1";
            DataTable dt = new DataTable();
            dt = GetTable(sql);
            treeList1.DataSource = dt;
            treeList1.KeyFieldName = "SYS_ID";//父级字段名称
            treeList1.ParentFieldName = "SYS_LEVEL";//展开所有节点
            //关闭全部窗体,除去Form1,Form1为主窗体
            for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
            {
                if (Application.OpenForms[i].Name != "Form1")
                {
                    Application.OpenForms[i].Close();
                }
            }
        }

private void ShowMenuToolStripMenuItem_Click(object sender, EventArgs e)
        { //显示菜单的代码
            this.dockPanel1.Show(); 
            this.dockPanel1.Dock = DevExpress.XtraBars.Docking.DockingStyle.Left;
        }

C# Dev利用TreeList设置菜单导航并双击节点打开模块窗体相关推荐

  1. 码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)

    文章目录 卷首语 谷歌API参考 1. 基本步骤 2. 创建一个AS项目,NoActivity 3. AS创建一级菜单的SettingsFragment 4. AS创建二级菜单的SettingsFra ...

  2. 利用jQuery制作的导航下拉菜单效果

    利用jQuery制作的导航下拉菜单效果,其实利用css同样可以实现导航下拉菜单效果,但自从学习了jQuery后,感觉还是jQuery做起来效果更好.jQuery制作导航下拉菜单,需要用到jQuery方 ...

  3. java底部菜单_安卓开发笔记——TabHost组件(一)(实现底部菜单导航)

    什么是TabHost? TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用windows操作系统的时候,经常见到如图所示的图形界面. TabHost选项卡,说到这个组件,不得不先 ...

  4. 转-TabHost组件(二)(实现底部菜单导航)

    http://www.cnblogs.com/lichenwei/p/3975095.html 上面文章<安卓开发复习笔记--TabHost组件(一)(实现底部菜单导航)>中提到了利用自定 ...

  5. Python Web前端实战案例——电商网站商品菜单导航栏

    jQuery是一个快速.小巧.轻量级的.写的少.做的多.功能丰富的 JavaScript 库,是目前最流行的 JS 框架.利用它可以帮我们快速实现一些炫酷的效果. 目录 1 原理先知 2 思路概要 3 ...

  6. HMI-50-【多媒体】菜单导航界面实现

    HMI-50-[多媒体]菜单导航界面实现 ​ 今天是清明小长假的第二天,我们来实现以下菜单.因为咱们这个是纯粹使用二维来凑三维,所以效果肯定是有点拉胯的,各位看官留情. 当前进度 ​ 按照以往的节奏. ...

  7. DevExpress的TreeList实现节点上添加自定义右键菜单并实现删除节点功能

    场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...

  8. TreeList右键菜单功能

    1:常用属性 1): Appearance->FocusedRow-->BackColor  设置选中的节点颜色 2):LookAndFell-->  将树的样式设置为加减号的样式, ...

  9. CSS+JS灰色树型菜单导航代码

    代码简介: CSS+JS打造的树型菜单,没有怎么美化,颜色看上去也不很美,提供一种思路,真想用的朋友好好修改一下颜色,里面都有注释,相信通过你的努力,它最终的效果一定很漂亮. 代码内容: <!D ...

最新文章

  1. Altium Designer同一个工程里不同原理图导入到不同的PCB
  2. 逻辑网拓扑和物理网拓扑——微云网络
  3. js在IE下面弹出打开和保存文件的对话框
  4. boost::histogram::axis::option用法的测试程序
  5. Java+大数据开发——Hadoop集群环境搭建(二)
  6. cacti不能实时刷新流量图_介绍一种编码帧内刷新算法
  7. java 陷阱,java 中的陷阱。
  8. SystemVerilog 2005 语法
  9. Effective C++ 学习笔记(24)
  10. Quartz-第一篇 认识Quartz
  11. 读文献、写论文时,有什么好用的软件或网站推荐?
  12. 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第一部分
  13. C#的DataTable详解
  14. Android 呼吸灯流程分析(一)
  15. Python Pycharm 对代码进行TODO标记注释
  16. 19.IIC通信:PCF8591:数模/模数转换芯片
  17. ImageIO类的使用
  18. 《改进SIR 模型在社交网络信息传播中的应用》仿真实现
  19. vue,的M、V、VM分别代表什么
  20. 基于规则的中文分词 - NLP中文篇

热门文章

  1. 网络直播对网络的要求有多高
  2. Oceanbase 扩容TPC-H测试
  3. 苹果13系统锁屏延迟_iPhone锁屏慢有延迟怎么办 苹果手机锁屏不灵敏解决方法
  4. 使用curl工具通过Gopher协议发送GET请求
  5. 零起步的Hadoop实践日记(搭建hadoop和hive)
  6. 报错解决:SyntaxError: Non-UTF-8 code starting with ‘\xe7‘
  7. 关机、睡眠和休眠有啥区别
  8. 【35】存储器层次结构全景:数据存储的大金字塔长什么样?
  9. golang 大数据平台_Golang在Momenta大数据平台当中的应用
  10. YOLOX改进之模型轻量化(Lite)