上篇讲了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; }}#endregionpublic 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";#endregionpublic 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不能通过.号进行绑定来关联。

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

转载于:https://www.cnblogs.com/FreeDong/archive/2013/01/18/2864795.html

DevExpress之TreeList绑定复杂数据类型相关推荐

  1. 第三方控件DevExpress的TreeList绑定XML文件

    研究了两天,网上也看了不少资料,但都是静态绑定到TreeList,就是在已知道表的情况下进行绑定,表中已经把KeyFieldName和ParentFieldName的关系确定好了,比较死板.我需要的功 ...

  2. dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件

    DevExpress提供的树形列表控件TreeList和树形下拉列表控件TreeListLookupEdit都是非常强大的一个控件,它和我们传统Winform的TreeView控件使用上有所不同,我一 ...

  3. DevExpress的TreeList实现显示本地文件目录并自定义右键实现删除与重命名文件

    场景 使用DevExpress的TreeList显示本磁盘下文件目录并在树节点上右键实现删除与添加文件. 效果 自定义右键效果 实现 首先在包含Treelist的窗体的load方法中对treelist ...

  4. Winform中双击DevExpress的TreeList的树形节点怎样获取当前节点

    场景 DevExpress的TreeList怎样设置数据源,从实例入手: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10254 ...

  5. DevExpress的TreeList实现自定义右键菜单打开文件选择对话框

    场景 DevExpress的TreeList实现节点上添加自定义右键菜单并实现删除节点功能: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...

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

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

  7. DevExpress的TreeList的常用属性设置以及常用事件

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

  8. Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)

    场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  9. DevExpress.XtraTreeList.TreeList的DataSource属性使用注意事项.

    表格对象进行绑定后,如果要清除绑定,一般都是让DataSource=Nothing即可. 而DevExpress.XtraTreeList.TreeList则比较特殊,需要调用 ClearNodes ...

  10. DevExpress之TreeList控件

    DevExpress之TreeList控件 第一篇文章,首先还是先来简单介绍下DevExpress组件. DevExpress概述 DevExpress:DevExpress 是一个软件公司,全称是  ...

最新文章

  1. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法...
  2. springboot处理参数再转发请求_SpringBoot图文教程6—SpringBoot中过滤器的使用
  3. redhat6.4 添加yum本地源和安装virtualbox增强组件
  4. centos 6.4 postfix mysql_postfix+dovecot+mysql+extmail安装笔记(基于CentOS 6)
  5. USB数据线内阻对充电电流的影响
  6. oracle触发器的类型及使用方法
  7. python周末吃什么_中午不知道吃什么?用Python爬取美团外卖评论帮你选餐!
  8. Linux技术学习路线图
  9. java int和String类型之间的相互转换
  10. java下载上传远程文件
  11. [C++基础]039_C++异常处理初级出门+中级进阶
  12. freemarker 标签循环list 以及获取下标值
  13. Windows10如何彻底卸载MySQL
  14. html如何生成条形码,使用jsbarcode生成条形码
  15. PENCIL 决策建模器
  16. CSS3鼠标悬停图片360度旋转效果
  17. 如何在线批量将PDF转换成JPG格式
  18. 联通光猫由网关模式,改为桥接模式。
  19. 「图文」介绍下微信怎么拉票刷票及微信投票怎样自己拉票方法
  20. 哥们别逗 了,写个脚本那真不叫运维自动化!

热门文章

  1. 如何制作macOS Monterey启动U盘
  2. mysql 查询优化 ~ 分区表查询的探索
  3. 超微 X9DRL-iF 服务器主板简介 BIOS相关图解
  4. spring security3.x学习(3)_初探过滤器机制和auto-config用法
  5. the 1st one
  6. Vue项目部署到SpringBoot工程下
  7. Java 对象不使用时,为什么要赋值为 null?
  8. 面试官:来,说说图片防盗链实现?
  9. 你靠什么在单位立足?此文堪称经典
  10. 构建微服务体系结构的最佳实践