[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 }