winfrom递归生成菜单,支持多级嵌套

private void Form2_Load(object sender, EventArgs e)
{
    CreateMenu();
}
private void CreateMenu()
{
    //定义菜单条
    Bar bar = new Bar("Menu Bar");
    bar.MenuBar = true;
    bar.Stretch = true;
    bar.Style = eDotNetBarStyle.Office2003;
    dotNetBarManager1.Bars.Add(bar); //添加到dotNetBarManager1对象
    bar.DockSide = eDockSide.Top;    //设置Dock样式

    System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start(); //  开始监视代码运行时间

    var listMenu = GetButtonItem(0);
    listMenu.ToList().ForEach(x => bar.Items.Add(x));
    bar.RecalcLayout(); //重绘布局

    stopwatch.Stop(); //  停止监视
    TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间

    this.labelX1.Text = "生成菜单耗时" + timespan.TotalSeconds.ToString() + "毫秒";
    //textBoxX1.LostFocus += (s, e) => { MessageBox.Show("失去焦点"); };
}
public class JsonTuple<T1, T2>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
    public KeyValuePair<Int32, Int32> KvType { get; set; }
    public Boolean Tag { get; set; }

    public JsonTuple(T1 item1, T2 item2, KeyValuePair<Int32, Int32> kvType, bool tag)
    {
        this.Item1 = item1;
        this.Item2 = item2;
        this.KvType = kvType;
        this.Tag = tag;
    }
    public JsonTuple(T1 item1, T2 item2, bool tag)
        : this(item1, item2, new KeyValuePair<int, int>(0, 0), tag)
    {
    }
}
private List<JsonTuple<string, string>> GetMenuSetter()
{
    List<JsonTuple<string, string>> listMenu = new List<JsonTuple<string, string>>
    {
        //有&会在字体下面显示下划线
        new JsonTuple<string,string>("bFile","&File",new KeyValuePair<int, int>(1,0),false),
        new JsonTuple<string,string>("bOpen","Open",new KeyValuePair<int, int>(2,1),false),
        new JsonTuple<string,string>("bClose","&Close",new KeyValuePair<int, int>(3,1),false),
        new JsonTuple<string,string>("bExit","&Exit",new KeyValuePair<int, int>(4,1),true),
        //====================================================
        new JsonTuple<string,string>("bCut","&Cut",new KeyValuePair<int, int>(5,0),false),
        new JsonTuple<string,string>("bCopy","&Copy",new KeyValuePair<int, int>(6,5),false),
        new JsonTuple<string,string>("bPaste","&Paste",new KeyValuePair<int, int>(7,5),false),
        new JsonTuple<string,string>("bClear","&Clear",new KeyValuePair<int, int>(8,5),true),

    };
    return listMenu;
}
private IEnumerable<ButtonItem> GetButtonItem(int pid)
{
    var listMenu = GetMenuSetter();

    var query = listMenu.Where(x => x.KvType.Value == pid).Select(x =>
    {
        var bi = new ButtonItem(x.Item1, x.Item2);
        bi.Tag = x.KvType; //标记
        bi.BeginGroup = x.Tag;
        return bi;
    });

    var plist = query.ToList();

    plist
        .ForEach(
            x => x
                .SubItems
                .AddRange(
                    GetButtonItem(((KeyValuePair<int, int>)x.Tag).Key).ToArray()
                )
        );

    return plist;
}

支持多级嵌套,看看效果:

时间: 2024-10-12 10:28:58

winfrom递归生成菜单,支持多级嵌套的相关文章

java从数据库读取菜单,递归生成菜单树

首先看一下菜单的样子 根据这个样子我们定义菜单类 public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 private List<Menu> chi

简单扩展让beetl HTML标签支持父子嵌套

默认情况下,Beetl的html标签并不支持父子嵌套,就像类似jsp标签那样,父标签需要知道子标签的信息,子标签也需要知道父标签信息.但是beetl只需要简单扩展,就能完成嵌套标签支持. 首先看一个最终的使用效果,实现俩个html标签table.tag,tr.tag.可以在页面上这么用: <#table data ="${userList}"> <#tr class="3c" name="name"> 名称 </#t

asp.net mvc+EF 递归生成树结构返回json

0.数据表结构,主要属性有:Id.parentId(父节Id).Text.Url……等等. 1.新建一个树结构MenuModels 1 public class MenuModels 2 { 3 private int _id; 4 private string _text; 5 private int? _parentid; 6 private string _icon; 7 private string _url; 8 private object _menus; 9 private Dic

Windows Azure Storage (22) Azure Storage如何支持多级目录

<Windows Azure Platform 系列文章目录> 熟悉Azure平台的读者都知道,Azure Blob有三层架构.如下图:(注意blob.core.chinacloudapi.net是Azure China的Service Endpoint) 1.Blob Name: 存储账号名称 2.Container Name,容器名称.概念上类似于文件夹 3.Blob Name:文件名称 Azure Storage Block Blob概念上类似网盘,用户可以把文件.图片.照片直接保存到A

【Android自定义控件】支持多层嵌套RadioButton的RadioGroup

前言 非常喜欢用RadioButton+RadioGroup做Tabs,能自动处理选中等效果,但是自带的RadioGroup不支持嵌套RadioButton(从源码可看出仅仅是判断子控件是不是RadioButton),本文参考RadioGroup修改了一个支持嵌套CompoundButton的控件,非常实用. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 /** * 支持嵌套

c#递归生成XML

递归方法大家应该都很熟悉了,简而言之就是方法内部调用自己,就这样不断重复重复再重复的执行, 不过要担心死循环哟... 当我们系统需要动态生成菜单时,也就是说我们系统的菜单是存在数据库中的,数据库结构类似于: ID,Name,Parent_ID 这种设计方法的时候,我们就需要根据ID 和 Parent_ID的关系来动态生成菜单.. 至于怎么生成菜单,今天就不介绍了,今天主要介绍的是 使用递归的方式来生成XML结构的文档.. 1 using System;  2  using System.Coll

uiautomatorviewer 优化定位符生成,支持生成Java,Python自动化代码

项目介绍 二次开发 uiautomatorviewer 优化定位符生成,支持生成Java,Python自动化代码,修复自带工具画面有动态加载时截图失败问题,优化自带工具截图速度 ,实现类似录制脚本功能.兼容IOS安卓. 软件架构 本工具以安卓SDK自带uiautomatorviewer为源码基础,在此上进行深度二次开发. 优化定位符Xpath生成,提取相对短的Xpath,解决自带工具Xpath太长不友好的问题 修复自带uiautomatorviewer截图报错,无法截图的Bug 优化截图速度优化

Linq递归生成easyui-tree

我把整个类放这里大加参考: public class ClassOrganization    {        static List<Model.ClassOrganization> org;        public List<Model.ClassOrganization> GetOrgTree(string _pid)        {            List<Model.ClassOrganization> porg = new List<M

WPF+通过配置文件生成菜单(Menu)+源码

这个月做项目,遇到过一个通过配置文件来生成菜单的解决方案,感觉挺优雅的,特地放到博客园来,以飨读者. 说来惭愧,以前做的项目都没有这样用过,都是固定死了.如果后续有需要加入菜单,还得在重新修改UI,然后提交code,才OK.但是如果通过配置文件的方式进行操作,则可以不用动code,只需要修改配置文件即可. 有兴趣的可以往下看,不难,很简单!~ 先看下这次demo的结构: 1.生成XML式的配置文件菜单项.. 我用XML格式来存储, <MenuList xmlns:xsi="http://w