上篇讲了PivotGridControl,有的大湿可能觉得废话多了,还有的说呢官方文档里面已经说得很详细了,这个倒是事实。但是文档是死的,业务是变幻莫测的,所以我今天还是来分享想下TreeList使用的一些个人经验,那些官方文档官方Demo有的就不多啰嗦了,可能只是一笔带过。
首先先一笔带过下这个TreeList的简单使用:
1.模拟创建一些实体和数据源提供代码。
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; } }
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。
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; } }
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不能通过.号进行绑定来关联。
个人见识有限,抛砖之后希望大家多多引玉!!