[WinForm]DataGridView如何绑定对象的复合属性

如下类似:

代表用户角色类

1     public class UserRole
2     {
3         public virtual int Id { get; set; }
4 
5         public virtual string Name { get; set; }
6     }

用户类:

 1     public class User
 2     {
 3         public virtual int Id { get; set; }
 4 
 5         public virtual string Name { get; set; }
 6 
 7         public virtual UserRole RoleInfo { get; set; }
 8         
 9         public virtual string Email { get; set; }
10 
11       }

这里演示只设置几个相关的属性,注意这里的RoleInfo复合型的属性(聚合属性?复杂对象属性?).

界面上binding设置,简单的属性,设置DataGridView的DataPropertyName就行了,对于角色信息也这样设置后,得到的不是你想要的显示结果(ToString()出来的xxx.xxx类什么的,可以重写这个User.ToString(),但是对于Id和Name都需要的情况呢).

设想这里的GridView有两列一个是RoleId,另外一个是RoleName,处理方法相同,这里以RoleName为例。(改写User类,增加这2个字段也能达到效果,不过为了更OO一点,这个方法先抛弃。)

CellFormatting事件闪亮登场,这个格式化单元格显示:

1 if(某个GridView.Columns[e.ColumnIndex].Name == "RoleName")
2             {
3                 User user=某个GridView.Rows[e.RowIndex].DataBoundItem as User;
4                 if (user != null && user.RoleInfo!=null)
5                 {
6                     e.Value = user.RoleInfo.Name;
7                     e.FormattingApplied = true;
8                 }             
9             }

某一行代表的一个User信息啦,把这个用户的角色信息扔给单元格就是了。

上面这个是绑定的复合属性User.RoleInfo,是否可以像web里的那个Eval("RoleInfo.Name")方式用呢。

 

某人写的一个比较通用的,具体我没试:

 1 private void 某个GridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 2 {
 3 if (dgPendingRequests.Columns[e.ColumnIndex].DataPropertyName.Contains("."))
 4 e.Value = EvaluateValue(dgPendingRequests.Rows[e.RowIndex].DataBoundItem, dgPendingRequests.Columns[e.ColumnIndex].DataPropertyName);
 5 }
 6 public string EvaluateValue(object obj, string property)
 7 {
 8 string prop = property;
 9 string ret = string.Empty;
10 if (property.Contains("."))
11 {
12 prop = property.Substring(0, property.IndexOf("."));
13 System.Reflection.PropertyInfo[] props = obj.GetType().GetProperties();
14 foreach (System.Reflection.PropertyInfo propa in props)
15 {
16 object obja = propa.GetValue(obj, new object[] { });
17 if (obja.GetType().Name.Contains(prop))
18 {
19 ret = this.EvaluateValue(obja, property.Substring(property.IndexOf(".") + 1));
20 break;
21 }
22 }
23 }
24 else
25 {
26 System.Reflection.PropertyInfo pi = obj.GetType().GetProperty(prop);
27 ret = pi.GetValue(obj, new object[] { }).ToString();
28 }
29 return ret;
30 }

 

详见:http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/7604beb3-b2a7-42c4-939a-178b9cf0dcfd/

posted @ 2012-09-26 13:24  xcf007  阅读(1595)  评论(0编辑  收藏  举报