zoukankan      html  css  js  c++  java
  • [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/

  • 相关阅读:
    HDU 4432 求因子+进制转换
    HDU 4438 概率 多个情况下的数学期望
    HDU 4424 并查集+贪心思想
    POJ 1611 记录节点数的并查集
    HDU 4430 二分查找
    HDU 4422 采蘑菇的小女孩
    最短路之SPFA模板
    zju pat1065. A+B and C (64bit)
    zju pat 1058 A+B in Hogwarts
    zju pat 1054 The Dominant Color
  • 原文地址:https://www.cnblogs.com/xcf007/p/2703797.html
Copyright © 2011-2022 走看看