c treelist绑定mysql_DevExpress之TreeList绑定复杂数据类型

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

首先先一笔带过下这个TreeList的简单使用:

1.模拟创建一些实体和数据源提供代码。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngMenuModel

public classMenuModel

{#region 字段属性

private intid;///

///Gets or sets the menu ID.///

public intID

{get { returnid; }set { id =value; }

}private intparentID;///

///Gets or sets the parent ID.///

/// The parent ID.

public intParentID

{get { returnparentID; }set { parentID =value; }

}private intorderID;///

///Gets or sets the order ID.///

/// The order ID.

public intOrderID

{get { returnorderID; }set { orderID =value; }

}private stringmenuName;///

///Gets or sets the name of the menu.///

/// The name of the menu.

public stringMenuName

{get { returnmenuName; }set { menuName =value; }

}#endregion

publicMenuModel() { }protectedMenuModel(MenuModel model)

{this.id =model.id;this.menuName =model.menuName;this.orderID =model.orderID;this.parentID =model.parentID;

}

}

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngMenuService

public classMenuService

{public ListGetMenus()

{//模拟在BLL获取数据

List list = new List();

MenuModel model1= newMenuModel();

model1.ID= 1;

model1.MenuName= "首页";

model1.OrderID= 1;

model1.ParentID= 0;

list.Add(model1);

MenuModel model2= newMenuModel();

model2.ID= 2;

model2.MenuName= "首页资讯";

model2.OrderID= 1;

model2.ParentID= 1;

list.Add(model2);

MenuModel model3= newMenuModel();

model3.ID= 3;

model3.MenuName= "首页图片";

model3.OrderID= 2;

model3.ParentID= 1;

list.Add(model3);

MenuModel model4= newMenuModel();

model4.ID= 4;

model4.MenuName= "首页置顶图片";

model4.OrderID= 1;

model4.ParentID= 3;

list.Add(model4);

MenuModel model5= newMenuModel();

model5.ID= 5;

model5.MenuName= "分类管理";

model5.OrderID= 2;

model5.ParentID= 0;

list.Add(model5);

MenuModel model6= newMenuModel();

model6.ID= 6;

model6.MenuName= "产品分类";

model6.OrderID= 1;

model6.ParentID= 5;

list.Add(model6);

MenuModel model7= newMenuModel();

model7.ID= 7;

model7.MenuName= "品牌分类";

model7.OrderID= 2;

model7.ParentID= 5;

list.Add(model7);

MenuModel model8= newMenuModel();

model8.ID= 8;

model8.MenuName= "关于我们";

model8.OrderID= 3;

model8.ParentID= 0;

list.Add(model8);

MenuModel model9= newMenuModel();

model9.ID= 9;

model9.MenuName= "简要介绍";

model9.OrderID= 1;

model9.ParentID= 8;

list.Add(model9);

MenuModel model10= newMenuModel();

model10.ID= 10;

model10.MenuName= "联系我们";

model10.OrderID= 2;

model10.ParentID= 8;

list.Add(model10);

MenuModel model11= newMenuModel();

model11.ID= 11;

model11.MenuName= "加入我们";

model11.OrderID= 3;

model11.ParentID= 8;

list.Add(model11);

MenuModel model12= newMenuModel();

model12.ID= 12;

model12.MenuName= "加盟";

model12.OrderID= 1;

model12.ParentID= 11;

list.Add(model12);

MenuModel model13= newMenuModel();

model13.ID= 13;

model13.MenuName= "参加我们的团队";

model13.OrderID= 2;

model13.ParentID= 11;

list.Add(model13);

MenuModel model14= newMenuModel();

model14.ID= 14;

model14.MenuName= "加盟条款";

model14.OrderID= 1;

model14.ParentID= 12;

list.Add(model14);returnlist;

}

}

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(objectsender, EventArgs e)

{

Init();

}private voidInit()

{

List list = newMenuService().GetMenus();this.treeList1.DataSource =list;

}

6.运行查看效果:

e2479c7acd43670e002b6447cab1654e.png

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

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngMenuModel

public classMenuModel

{#region 字段属性

private intid;///

///Gets or sets the menu ID.///

public intID

{get { returnid; }set { id =value; }

}private intparentID;///

///Gets or sets the parent ID.///

/// The parent ID.

public intParentID

{get { returnparentID; }set { parentID =value; }

}private intorderID;///

///Gets or sets the order ID.///

/// The order ID.

public intOrderID

{get { returnorderID; }set { orderID =value; }

}private Listlanguages;public ListLanguages

{get { return this.languages; }set { this.languages =value; }

}publicMenuLanguageModel DefaultLanguage

{get{if (this.languages == null || this.languages.Count < 1)

{return null;

}return this.languages.Find(new Predicate(delegate(MenuLanguageModel model) {return model.Type ==DEFAULT_LANGUAGE;

}));

}

}///

///实际使用此默认值可从配置或系统线程中获取///

const string DEFAULT_LANGUAGE = "zh-CN";#endregion

publicMenuModel()

{this.languages = new List();

}///

///为模拟创建多语言数据方便编写///

public void AddLuanguage(string type, stringname)

{

MenuLanguageModel l= newMenuLanguageModel();

l.ID= GetMaxID() + 1;

l.MenuID= this.ID;

l.Name=name;

l.Type=type;this.languages.Add(l);

}///

///为获取创建ID方便///

private intGetMaxID()

{int max = 0;this.languages.ForEach(new Action(delegate(MenuLanguageModel model) {if (model.ID >max)

{

max=model.ID;

}

}));returnmax;

}

}

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngMenuLanguageModel

public classMenuLanguageModel

{private intid;private intmenuID;private stringtype;private stringname;public intID

{get { return this.id; }set { this.id =value; }

}public intMenuID

{get { return this.menuID; }set { this.menuID =value; }

}///

///语言类型///

public stringType

{get { return this.type; }set { this.type =value; }

}public stringName

{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 stringToString()

{return this.Name; ;

}

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

针对上述我简要总结一下(其实上面啰嗦了那么多我就是想表达下面的结论):

1.DevExpress深层复杂绑定,可通过.号将需要显示的属性串联起来,如DefaultLanguage.Name,显示的是DefaultLanguage属性的这个对象的Name属性。

2.在.NET绑定中显示时,其实调用的都是对应字段或属性的ToString方法,因而在显示复杂类型中,我们可以通过重写ToString方法以控制其绑定后显示出我们需要的样子,这也是.NET中比较通用的方式。

3.另外,在TreeList的ParentFieldName属性中的ParentID不能通过.号进行绑定来关联。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值