代码之家  ›  专栏  ›  技术社区  ›  George Mauer

我应该编写自己的GridView实现吗?

  •  3
  • George Mauer  · 技术社区  · 16 年前

    我并没有用GridView做太多的工作,在使用它之后,我发现它比我需要的要复杂,但是缺少了一些我希望它具备的基本能力。毫无疑问,它的实现是有意义的,因为它90%的时间目的是绑定到一个数据集,特别是在声明性地执行此操作时,但是我打算将它绑定到 IEnumerable<T> 在密码里。

    我需要的是能够轻松地做到以下几点

    • a) 与 IEnumerable<T> 其中列只能限于 T
    • b) 查询以返回其行的集合,在该集合中,每一行都可以由单元格绑定到的属性查找单元格

    基本上,实现以下接口是很好的

    public interface IEasyGridBinder {
      void Bind<T>(IEnumerable<T> bindableObjects, params string[] propertiesToBind);
      IList<IDictionary<string, string>> Values {get;}
    }
    

    因此,为了实现这个功能,我应该编写自己的自定义EasyGridBinder,它继承了GridView并实现了这个接口,还是有一个真正简单的方法来完成这些我只是不熟悉的事情?

    P、 如果我能写些类似的东西

    myGrid.Bind(myEntities, e=>{e.Id; e.Name; e.Customer.Name;});
    

    不过,我想我读了一些表达式之后,自己就能明白了

    后续问题: 是否无法获取输入到gridview且未转换为html的原始数据?如果作为输入接收的字段是空字符串,则单元格似乎包含“”,那么是否无法区分空字符串的输入和空格?如果真是这样的话,那么我可能最终会重新实现GridView的大部分功能。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Dan Davies Brackett    16 年前

    LinqDataSource 允许您指定对象作为数据源的备份存储。然后将GridView绑定到该数据源。它在.aspx中的声明要多一些,但是以后要维护的代码要少一些,因为feature bloat使您离重新实现GridView越来越近了。

        2
  •  1
  •   ahsteele tungi52    16 年前

    如果将GridViews AutoGenerateColumns属性设置为false,则只会生成指定的列。通过创建BoundFields并将其添加到Gridview Columns集合中来完成此操作。

    GridView gv = new GridView();
    gv.AutoGenerateColumns = false;
    
    BoundField bf = new BoundField();
    bf.DataField = "Id";
    bf.HeaderText = "ID";
    gv.Columns.Add(bf);
    
    BoundField bf = new BoundField();
    bf.DataField = "Name";
    bf.HeaderText = "Name";
    gv.Columns.Add(bf);
    
    BoundField bf = new BoundField();
    bf.DataField = "Customer.Name";
    bf.HeaderText = "Customer Name";
    gv.Columns.Add(bf);
    
    gv.DataSource = IEnumerable<T>;
    gv.DataBind();
    

    我已经在注释中写下了这个解释,但我想我会把它移到更可见的地方,并添加一个代码示例:

    要使上述内容动态化,请创建一个从属性继承的GridViewDisplayAttribute类。给GridViewDisplayAttribute一个HeaderText属性。修饰T指定HeaderText的属性。通过迭代T的属性,使用HeaderText为每个修饰属性创建边界字段。

    快速未测试代码示例:

    using System;
    public class GridViewDisplayAttribute : Attribute
    {
    public GridViewDisplayAttribute(string headerText)
    {
            HeaderText = headerText;
    }
        public readonly bool HeaderText;
    }
    

    GridView gv = new GridView();
    gv.AutoGenerateColumns = false;
    
    Type t = <T>.GetType();
    PropertyInfo[] pis = t.GetProperties();
    
    foreach (PropertyInfo pi in pis)
    {
        GridViewDisplayAttribute[] gvdaArray = pi.GetCustomAttributes(
            typeof(GridViewDisplayAttribute), true);
    
        foreach (GridViewDisplayAttribute gvda in gvdaArray)
        {
            BoundField bf = new BoundField();
            bf.DataField = pi.Name;
            bf.HeaderText = gvda.HeaderText;
        }
    
        gv.Columns.Add(bf);
    }
    
    gv.DataSource = IEnumerable<T>;
    gv.DataBind();
    
        3
  •  0
  •   David    16 年前

    我建议使用扩展方法来添加所需的行为。唯一的缺点是不能将“Values”作为属性添加。

    推荐文章