GridView 动态添加 数据列,绑定方法 (1/2)

gridview 动态添加 数据列,绑定方法

通过继承 gridview 并且重载  createcolumns() 添加自己想要的 column,根据扩展属性中的键值对生成column。
通过继承 bouldfield,并且重载 initializedatacell() 和 getvalue() 实现自己希望的绑定方法,实现可以基于方法的数据绑定,从而可以将扩展属性中的键值绑定到对应的cell中。

gridview 是asp教程.net中表格数据显示控件中的一种,可以支持数据绑定,绑定的数据源我们一般用实现ienumerable<t>接口的对象,t可以是任何一个clr类(当然还有一些其他的数据源格式),这些大家基本都很熟悉,但是最近碰到一个新的需求:

     像有一个类似于:   

  

  public class book
    {
        public int id { get; set; }

        public string name { get; set; }

        public dictionary<string, object> extendproperties { get; set; }
    }

 

  其中extendproperties 是用来存储不同用户自定义的扩展属性的,用键值对的形式保存,key保存扩展属性名,value保存扩展属性值,每个用户可能的扩展属性个数和键值都不一样。

     现在,如果我们需要把list<book>绑定在gridview上面,但是希望将extendproperties中的扩展属性也都显示出来,而且相应的key显示在column的header,而value则显示在相应的cell中。

     起初想沿着gridview绑定一般数据的思路考虑,看是否能够通过动态属性的方式将extendproperties中的键值对匹配成相应的对象属性,(没有测试是否能够成功),但是又觉得数据绑定是控件的事情,这个不应该由数据本身来负责,那我们能否通过修改gridview本身的行为来达到这个目的呢?? 答案是肯定的!

     我们都知道,gridview本身是有一个autogeneratecolumns的属性,如果设置为true的话,gridview将自动添加一些列,这些列对应book中的每一个可绑定的属性,这里是用propertydescriptor来实现的(好像是考虑到designmode,而没有用type来做反射)。根据这个思路,我们可以先看看autogeneratecolumns到底对gridview有哪些影响以及gridview本身是如何生成columns的。

     通过查看gridview的源码,我们可以看到几个重要的方法:

代码

protected virtual icollection createcolumns(pageddatasource datasource, bool usedatasource);

protected virtual autogeneratedfield createautogeneratedcolumn(autogeneratedfieldproperties fieldproperties);
 

    其中 createcolumns方法是gridview用来生成列的,而在其中会根据autogeneratecolumns属性来判断是否调用createautogeneratecolumn来自动生成相应属性的列。而且这两个方法都是可以重载的,根据我们的需求,我们可以构建一个gridview的子类,重载 createcolumns 方法,在 调用 base.createcolumns的返回结果中插入我们希望生成的column即可。

   代码如下:

代码 
     

   #region properties

        public bool autogenerateextendpropertiescolumn { get; set; }

        public int autogeneratecolumnsafter { get; set; }

        public string extendpropertiesdatafield { get; set; }

        #endregion
        
        protected override icollection createcolumns(pageddatasource datasource, bool usedatasource)
        {
            icollection collection = base.createcolumns(datasource, usedatasource);           

            if (autogenerateextendpropertiescolumn )
            {
                arraylist list = new arraylist();

                icollection extendpropertiescollection = createextendpropertiescolumns(datasource, usedatasource);

                arraylist list1 = new arraylist();
                foreach (var c in collection)
                {
                    list1.add(c);
                }

                arraylist list2 = new arraylist();
                if (extendpropertiescollection != null)
                {
                    foreach (var c in extendpropertiescollection)
                    {
                        list2.add(c);
                    }
                }

                int copyfrom = autogeneratecolumnsafter < list1.count ? autogeneratecolumnsafter : list1.count - 1;
                copyfrom = copyfrom >= 0 ? copyfrom : -1;

                for (int i = 0; i <= copyfrom; i++)
                {
                    list.add(list1[i]);
                }
               
                list.addrange(list2.toarray());

                for (int i = copyfrom + 1; i < list1.count; i++)
                {
                    list.add(list1[i]);
                }
                return list;
            }
            return collection;
        }

        protected virtual icollection createextendpropertiescolumns(pageddatasource datasource, bool usedatasource);

 

 

 其中我添加了几个属性和一个新的方法:

代码
public bool autogenerateextendpropertiescolumn { get; set; }

public int autogeneratecolumnsafter { get; set; }
 
public string extendpropertiesdatafield { get; set; }

protected virtual icollection createextendpropertiescolumns(pageddatasource datasource, bool usedatasource);
 

    autogenerateextendpropertiescolumn是用来判断是否要生成扩展属性对应的column,

    而 autogeneratecolumnsafter是用来判断将自动生成的column应该从什么位置开始插入,

    extendpropertiesdatafield 是用来指明在绑定的对象中,哪个属性是存储扩展属性的信息的,

    方法 createextendpropertiescolumns是用来生成与extendproperties对应的columns.

     这里只是简单的举个例子,如何通过重载 createcolumns 方法来实现自己动态添加column 的目的。

首页 1 2 末页

时间: 2024-08-01 20:39:12

GridView 动态添加 数据列,绑定方法 (1/2)的相关文章

关于gridview动态添加模版列分页后模版列中控件消失的问题

问题描述 我动态添加了GridView中的所有列,包括一个checkbox模版列可是,分页后,模版列的控件消失了,请问这个问题如何解决,已经弄了一天了. 解决方案 解决方案二:为什么没人回答啊?这个问题很简单吗?解决方案三:我再顶起!我再顶起!

jQuery给动态添加的元素绑定事件的方法

 这篇文章主要介绍了jQuery给动态添加的元素绑定事件的方法,对比了jQuery中事件绑定的方法以及常见版本使用绑定的区别,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了jQuery给动态添加的元素绑定事件的方法.分享给大家供大家参考.具体分析如下: jquery中绑定事件一般使用bind,或者click,但是这只能是对已经加载好的元素定义事件,那些后来添加插入的元素则需要另行绑定.在1.7版本以前使用live.但是在1.8版本以后推荐使用on.这里介绍jQuery中如何给

Ajax动态为下拉列表添加数据的实现方法

1. 前台jsp,新建一个下拉控件 <select id="seldvd" onChange="sel_onchange(this)"></select> 2. js部分,建一个function方法,利用ajax,指向 'getAllTypes.action' 的servlet部分,获取传来的下拉列表的数据,动态填充 <span style="white-space:pre"> </span>fun

c#Gridview动态增加新列求助

问题描述 用VS2010做一个c#的界面这是GridView已经做好的页面,但是不是动态绑定,还有要求修改成下面格式的页面,还要求动态绑定,小弟实在没辙了,请各路大神帮忙提供个思路~或者方法就行​ 解决方案 解决方案二:如何在GridView中动态添加模板列ICollectionCreateDataSource(){DataTabledt=newDataTable();//创建一个DataTable对象DataRowdr;//定义框架dt.Columns.Add(newDataColumn("i

datagrid动态添加模板列

问题描述 又一个DataGrid,已经绑定两列数据,我想再给它动态添加两个绑定列我用的下面的代码TemplateColumntc=newTemplateColumn();tc.HeaderText="ddddd";this.DataGrid1.Columns.AddAt(0,tc);DataGrid里面怎么不显示我加的这列啊 解决方案 解决方案二:这段代码貌似有问题,不是ColumnField能往里面加吗?

jQuery中给动态添加的代码绑定添加事件

在jquery推出新版本,使用.on()以前,我们会用.live()来为动态添加的代码绑定事件,但是现在jQuery用.on()替代了.live() 先看个.live()实例  代码如下 复制代码  $(".RemoveLink").live("click",function () {                 // Get the id from the link                 var recordToDelete = $(this).at

使用javascript动态添加数据到 HTML 页面

今天简单的学习了一下有关对象字面量的定义和 javascript 如何取出对象字面量的值的知识,javascript 动态添加数据到 HTML 页面的问题. [学习目标]有如下的一组数据通过 Ajax 传递过来: var dataList = [ { state: 2, // 0:sharing 1:unJoin 2:sharingEnd name: '客户1', phone: 13675896031 }, { state: 1, // 0:sharing 1:unJoin 2:sharingE

JavaScript实现动态添加,删除行的方法实例详解

  本文实例讲述了JavaScript实现动态添加,删除行的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

JQuery实现动态添加删除评论的方法

  本文实例讲述了JQuery实现动态添加删除评论的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69