zoukankan      html  css  js  c++  java
  • DevExpress之TreeList绑定复杂数据类型

    上篇讲了PivotGridControl,有的大湿可能觉得废话多了,还有的说呢官方文档里面已经说得很详细了,这个倒是事实。但是文档是死的,业务是变幻莫测的,所以我今天还是来分享想下TreeList使用的一些个人经验,那些官方文档官方Demo有的就不多啰嗦了,可能只是一笔带过。

    首先先一笔带过下这个TreeList的简单使用:
    1.模拟创建一些实体和数据源提供代码。

    MenuModel
        public class MenuModel
        {
            #region 字段属性
    
            private int id;
            /// <summary>
            /// Gets or sets the menu ID.
            /// </summary>
            public int ID
            {
                get { return id; }
                set { id = value; }
            }
    
            private int parentID;
            /// <summary>
            /// Gets or sets the parent ID.
            /// </summary>
            /// <value>The parent ID.</value>
            public int ParentID
            {
                get { return parentID; }
                set { parentID = value; }
            }
    
            private int orderID;
            /// <summary>
            /// Gets or sets the order ID.
            /// </summary>
            /// <value>The order ID.</value>
            public int OrderID
            {
                get { return orderID; }
                set { orderID = value; }
            }
    
            private string menuName;
            /// <summary>
            /// Gets or sets the name of the menu.
            /// </summary>
            /// <value>The name of the menu.</value>
            public string MenuName
            {
                get { return menuName; }
                set { menuName = value; }
            }
    
            #endregion
    
            public MenuModel() { }
    
            protected MenuModel(MenuModel model)
            {
                this.id = model.id;
                this.menuName = model.menuName;
                this.orderID = model.orderID;
                this.parentID = model.parentID;
            }
        }
    MenuService
        public class MenuService
        {
            public List<MenuModel> GetMenus()
            {
                //模拟在BLL获取数据
                List<MenuModel> list = new List<MenuModel>();
                MenuModel model1 = new MenuModel();
                model1.ID = 1;
                model1.MenuName = "首页";
                model1.OrderID = 1;
                model1.ParentID = 0;
                list.Add(model1);
    
                MenuModel model2 = new MenuModel();
                model2.ID = 2;
                model2.MenuName = "首页资讯";
                model2.OrderID = 1;
                model2.ParentID = 1;
                list.Add(model2);
    
                MenuModel model3 = new MenuModel();
                model3.ID = 3;
                model3.MenuName = "首页图片";
                model3.OrderID = 2;
                model3.ParentID = 1;
                list.Add(model3);
    
                MenuModel model4 = new MenuModel();
                model4.ID = 4;
                model4.MenuName = "首页置顶图片";
                model4.OrderID = 1;
                model4.ParentID = 3;
                list.Add(model4);
    
                MenuModel model5 = new MenuModel();
                model5.ID = 5;
                model5.MenuName = "分类管理";
                model5.OrderID = 2;
                model5.ParentID = 0;
                list.Add(model5);
    
                MenuModel model6 = new MenuModel();
                model6.ID = 6;
                model6.MenuName = "产品分类";
                model6.OrderID = 1;
                model6.ParentID = 5;
                list.Add(model6);
    
                MenuModel model7 = new MenuModel();
                model7.ID = 7;
                model7.MenuName = "品牌分类";
                model7.OrderID = 2;
                model7.ParentID = 5;
                list.Add(model7);
    
                MenuModel model8 = new MenuModel();
                model8.ID = 8;
                model8.MenuName = "关于我们";
                model8.OrderID = 3;
                model8.ParentID = 0;
                list.Add(model8);
    
                MenuModel model9 = new MenuModel();
                model9.ID = 9;
                model9.MenuName = "简要介绍";
                model9.OrderID = 1;
                model9.ParentID = 8;
                list.Add(model9);
    
                MenuModel model10 = new MenuModel();
                model10.ID = 10;
                model10.MenuName = "联系我们";
                model10.OrderID = 2;
                model10.ParentID = 8;
                list.Add(model10);
    
                MenuModel model11 = new MenuModel();
                model11.ID = 11;
                model11.MenuName = "加入我们";
                model11.OrderID = 3;
                model11.ParentID = 8;
                list.Add(model11);
    
                MenuModel model12 = new MenuModel();
                model12.ID = 12;
                model12.MenuName = "加盟";
                model12.OrderID = 1;
                model12.ParentID = 11;
                list.Add(model12);
    
                MenuModel model13 = new MenuModel();
                model13.ID = 13;
                model13.MenuName = "参加我们的团队";
                model13.OrderID = 2;
                model13.ParentID = 11;
                list.Add(model13);
    
                MenuModel model14 = new MenuModel();
                model14.ID = 14;
                model14.MenuName = "加盟条款";
                model14.OrderID = 1;
                model14.ParentID = 12;
                list.Add(model14);
    
                return list;
            }
        }

     2. 创建windows应用程序,往窗口拖放一个TreeList控件(神马,你找不到DevExpress的TreeList控件吗?好 
    了,提示一下,可以参照鄙人上一篇Blog: 
    http://www.cnblogs.com/FreeDong/archive/2013/01/09/2853797.html )。

    3.在TreeList控件的Run Designer里“Add Column”,设置其绑定字段为“MenuName”(如不明请按上述提示参照前一篇Blog,以后不再提醒了啊,事不过三,哼哼!最近交往的女孩子总喜欢“哼哼”搞得我被传染了) 。
    4.设置TreeList的属性:KeyFieldName=“ID”,ParentFieldName=“ParentID”。呃,你是不是发现不用你动这个属性已经是这样了?小心可能有鬼哦!!
    5.在窗体空白处双击,以便它自动为咱们生成Form1_Load事件代码。编写窗体后台代码如下:

            private void Form1_Load(object sender, EventArgs e)
            {
                Init();
            }
    
            private void Init()
            {
                List<MenuModel> list = new MenuService().GetMenus();
                this.treeList1.DataSource = list;
            }    

    6.运行查看效果:

    7.够简单吧,当然了TreeList还有很多相当牛逼的功能,可参照官方提供的Demo即可。

      接下来才是本文的正题,我们刚开始做的项目,比如说一个网站,在国内不错,但是当有外国人访问的时候,要不要提供英文版呢?这就是项目中要涉及的多语言版本。假设我们现在要做的菜单支持多语言,那么数据结构是不是多一张语言表,而这个时候原来MenuName就需要抛弃了,看下我改造的支持多语言菜单需要的两个model。   

    MenuModel
        public class MenuModel
        {
            #region 字段属性
    
            private int id;
            /// <summary>
            /// Gets or sets the menu ID.
            /// </summary>
            public int ID
            {
                get { return id; }
                set { id = value; }
            }
    
            private int parentID;
            /// <summary>
            /// Gets or sets the parent ID.
            /// </summary>
            /// <value>The parent ID.</value>
            public int ParentID
            {
                get { return parentID; }
                set { parentID = value; }
            }
    
            private int orderID;
            /// <summary>
            /// Gets or sets the order ID.
            /// </summary>
            /// <value>The order ID.</value>
            public int OrderID
            {
                get { return orderID; }
                set { orderID = value; }
            }
    
            private List<MenuLanguageModel> languages;
            public List<MenuLanguageModel> Languages
            {
                get { return this.languages; }
                set { this.languages = value; }
            }
    
            public MenuLanguageModel DefaultLanguage
            {
                get
                {
                    if (this.languages == null || this.languages.Count < 1)
                    {
                        return null;
                    }
    
                    return this.languages.Find(new Predicate<MenuLanguageModel>(delegate(MenuLanguageModel model) {
                        return model.Type == DEFAULT_LANGUAGE;
                    }));
                }
            }
    
            /// <summary>
            /// 实际使用此默认值可从配置或系统线程中获取
            /// </summary>
            const string DEFAULT_LANGUAGE = "zh-CN";
            #endregion
    
            public MenuModel() 
            {
                this.languages = new List<MenuLanguageModel>();
            }
    
            /// <summary>
            /// 为模拟创建多语言数据方便编写
            /// </summary>
            public void AddLuanguage(string type, string name)
            {
                MenuLanguageModel l = new MenuLanguageModel();
                l.ID = GetMaxID() + 1;
                l.MenuID = this.ID;
                l.Name = name;
                l.Type = type;
                this.languages.Add(l);
            }
    
            /// <summary>
            /// 为获取创建ID方便
            /// </summary>
            private int GetMaxID()
            {
                int max = 0;
                this.languages.ForEach(new Action<MenuLanguageModel>(delegate(MenuLanguageModel model) {
                    if (model.ID > max)
                    {
                        max = model.ID;
                    }
                }));
                return max;
            }
        }
    MenuLanguageModel
        public class MenuLanguageModel
        {
            private int id;
            private int menuID;
            private string type;
            private string name;
    
            public int ID
            {
                get { return this.id; }
                set { this.id = value; }
            }
    
            public int MenuID
            {
                get { return this.menuID; }
                set { this.menuID = value; }
            }
    
            /// <summary>
            /// 语言类型
            /// </summary>
            public string Type
            {
                get { return this.type; }
                set { this.type = value; }
            }
    
            public string Name
            {
                get { return this.name; }
                set { this.name = value; }
            }
        }

      在TreeList控件的Run Designer里找到刚刚添加“MenuName”字段,将FieldName属性改为 “DefaultLanguage.Name”,然后运行,发现,显示效果与上一次运行的完全一致。
      我们再在MenuModel类里修改常量“DEFAULT_LANGUAGE”值为“en-US”,好,一个全新英文界面出来咯,嘎嘎!依次类推可以使其支持我们所需要的语言的哦,亲!!

    接下来看另外一种解决方案,也是.NET开发中比较通用的方案,Override ToString方法。现在,我在MenuLanguageModel类里面添加方法:

            public override string ToString()
            {
                return this.Name; ;
            }    

    然后在TreeList控件的Run Designer里找到“MenuName”字段,将FieldName属性改为 “DefaultLanguage”,然后运行,发现,显示效果与之前运行的完全一致。

    针对上述我简要总结一下(其实上面啰嗦了那么多我就是想表达下面的结论):
    1.DevExpress深层复杂绑定,可通过.号将需要显示的属性串联起来,如DefaultLanguage.Name,显示的是DefaultLanguage属性的这个对象的Name属性。
    2.在.NET绑定中显示时,其实调用的都是对应字段或属性的ToString方法,因而在显示复杂类型中,我们可以通过重写ToString方法以控制其绑定后显示出我们需要的样子,这也是.NET中比较通用的方式。
    3.另外,在TreeList的ParentFieldName属性中的ParentID不能通过.号进行绑定来关联。

    个人见识有限,抛砖之后希望大家多多引玉!!

  • 相关阅读:
    mybatis以序列周期,同样处理的这个问题的价值
    达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面
    采用curl库
    MFC 盾webBrowser打开弹出的页面
    reactnative调研
    React Native通信机制详解
    问题与学习 分析与综合
    学习、概念与概念簇
    奥苏伯尔学习理论
    语言与编程语言
  • 原文地址:https://www.cnblogs.com/FreeDong/p/2864795.html
Copyright © 2011-2022 走看看