如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)

很长一段时间中,不管是使用DataGrid还是GridView都是通过拖放的方式。而这两天有个需求必须使用自定义的GridView,动态创建GridView的Columns,折腾了数小时,终于搞定,下面来说说具体的方法,希望能够帮助新手,也希望高手指点,毕竞我也够菜的;入正题:

一、来看看在VS2005自带的帮助文档中在Repeater使用动态创建的的方法:

要创建动态模板,请创建以后需要时可实例化的模板类。

创建模板类

  1. 创建实现System.Web.UI.ITemplate接口的新类。

  2. 您也可以将值传递到类的构造函数,类可以使用该值来确定要创建的模板类型(ItemTemplate、AlternatingItemTemplate等)。

    ListItemType的参数。ListItemType枚举为Repeater、DataList和其他控件定义可能的模板类型。

     

  3. 在类中,实现InstantiateIn方法,该方法是ITemplate接口的成员。

    此方法提供将文本实例和控件实例插入指定容器的方法。

  4. 在InstantiateIn方法中,为模板项创建控件,设置其属性,然后将它们添加到父级的Controls集合。

    您可以通过传递到InstantiateIn方法的引用访问父控件。

    Literal控件或LiteralControl控件的控件,设置它们的Text属性,然后向父集合添加这些控件。

     

    下面的代码示例阐释完整的模板类,该类显示某些静态文本(“Itemnumber:”)和计数器。计数器是名为itemcount的静态值(在VisualBasic中为共享值),在每次创建新项时都会递增。该类定义一个接受ListItemType枚举值以指示所创建模板类型的显式构造函数。根据所创建的模板类型,代码创建不同类型的控件并将其添加到父控件的Controls集合。最终结果是一个HTML表,其中的交替项模板具有不同的背景色。

    publicclassMyTemplate:ITemplate
    ...{
    staticintitemcount=0;
    ListItemTypetemplateType;

    publicMyTemplate(ListItemTypetype)
    ...{
    templateType=type;
    }

    publicvoidInstantiateIn(System.Web.UI.Controlcontainer)
    ...{
    Literallc=newLiteral();
    switch(templateType)
    ...{
    caseListItemType.Header:
    lc.Text="<TABLEborder=1><TR><TH>Items</TH></TR>";
    break;
    caseListItemType.Item:
    lc.Text="<TR><TD>Itemnumber:" itemcount.ToString()
    "</TD></TR>";
    break;
    caseListItemType.AlternatingItem:
    lc.Text="<TR><TDbgcolor=lightblue>Itemnumber:"
    itemcount.ToString() "</TD></TR>";
    break;
    caseListItemType.Footer:
    lc.Text="</TABLE>";
    break;
    }
    container.Controls.Add(lc);
    itemcount =1;
    }
    }

     

使用动态模板有了可用的动态模板,就可以在代码中将其实例化了。

 

创建动态模板
  1. 创建动态模板的实例,假如合适的话,将一个项类型值传递给它。

  2. 将该实例分配给模板化控件的模板属性之一,如ItemTemplate、AlternatingItemTemplate和HeaderTemplate属性。

    下面的代码示例演示如何与Repeater控件一起使用动态模板。在此示例中,在加载页时,而且是在控件绑定到数据源之前,将模板实例化。

    privatevoidPage_Load(objectsender,System.EventArgse)
    ...{
    SqlConnectionconn=
    newSqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);

    SqlDataAdaptersqlDataAdapter1;
    DataSetdsCategories1;

    sqlDataAdapter1=newSqlDataAdapter("SELECTCategoryID,CategoryNameFROMCategories",conn);
    dsCategories1=newDataSet();

    Repeater1.HeaderTemplate=newMyTemplate(ListItemType.Header);
    Repeater1.ItemTemplate=newMyTemplate(ListItemType.Item);
    Repeater1.AlternatingItemTemplate=
    newMyTemplate(ListItemType.AlternatingItem);
    Repeater1.FooterTemplate=newMyTemplate(ListItemType.Footer);
    sqlDataAdapter1.Fill(dsCategories1,"Categories");
    Repeater1.DataSource=dsCategories1.Tables["Categories"];
    Repeater1.DataBind();
    }

     

向模板添加数据绑定

根据创建类的方法,可以用多种方法访问模板类中的数据。一种方法是页框架自行实现数据绑定-当您向模板添加控件时,也会为这些控件的DataBinding事件添加处理程序。在创建了模板项及其所有控件后,会引发此事件,这样您就有机会获取数据并在控件中使用数据。

添加数据绑定事件处理程序
  • 在动态模板中创建控件后,添加对控件的DataBinding事件的事件处理程序的引用。(接下来您将创建事件处理程序)。

    下面的代码示例演示了模板类的一部分,该部分阐释了如何将新创建的控件绑定到名为TemplateControl_DataBinding的方法:

     

    caseListItemType.Item:

    lc.Text="<TR><TD>";
    lc.DataBinding =newEventHandler(TemplateControl_DataBinding);
    break;

    在上例中,您添加到文本控件的Text属性的文本不同于前一示例。该示例只包含了项模板的表行和单元格的开头。您将在数据绑定事件处理程序中填写单元格和行。

下一步是创建事件处理程序,在控件处于数据绑定状态时将调用该事件处理程序。

为DataBinding事件创建处理程序
  1. 创建属于模板类的方法,它还是该类的其他方法(如InstantiateIn)的对等方法。处理程序的名称必须与早期绑定事件时使用的名称相匹配。该方法应该具有以下签名:

    privatevoidTemplateControl_DataBinding(objectsender,
    System.EventArgse)

     

  2. 通过执行以下操作获取对包含数据的DataItem对象的引用:

    1. 获取对模板项的引用。创建变量来保存该引用,然后将从控件的NamingContainer属性获取的值分配给它。

    2. 使用该引用来获取命名容器的(模板项的)DataItem属性。

    3. 从DataItem对象提取单个数据元素(例如数据列),并使用它来设置您要绑定的控件的属性。

      下面的代码示例阐释在动态模板内执行数据绑定的一种方式。它演示了在Repeater控件的模板中创建的Literal控件的完整数据绑定事件处理程序。

      privatevoidTemplateControl_DataBinding(objectsender,
      System.EventArgse)
      ...{

      Literallc;

      lc=(Literal)sender;
      RepeaterItemcontainer=(RepeaterItem)lc.NamingContainer;
      lc.Text =DataBinder.Eval(container.DataItem,"CategoryName");
      lc.Text ="</TD></TR>";
      }

       

      创建模板类publicclassGaugeValueTemplate:ITemplate
      ...{
      ITemplate成员#regionITemplate成员

      publicvoidInstantiateIn(Controlcontainer)
      ...{
      LinkButtonlbGaugeMakeValue=newLinkButton();
      lbGaugeMakeValue.ID="LB_GaugeMakeValue";
      lbGaugeMakeValue.DataBinding =newEventHandler(lbGaugeMakeValue_DataBinding);
      lbGaugeMakeValue.CommandName="GaugeMakeValue";

      container.Controls.Add(lbGaugeMakeValue);
      }

      voidlbGaugeMakeValue_DataBinding(objectsender,EventArgse)
      ...{
      LinkButtonlbGaugeMakeValue=(LinkButton)sender;
      GridViewRowcontainer=(GridViewRow)lbGaugeMakeValue.NamingContainer;

      //绑定GaugeMakeValue字段的值
      lbGaugeMakeValue.Text=DataBinder.Eval(container.DataItem,"GaugeMakeValue").ToString();
      }

      #endregion
      }使用模板   TemplateFieldGaugeMakeValueColumn=newTemplateField();
      GaugeMakeValueColumn.HeaderText="指标制定值";
      GaugeMakeValueColumn.ItemTemplate=newGaugeValueTemplate();从这里可以看出GridView与Repeater控件中的区别在于:

       

      Repeater:RepeaerItemcontainer=(RepeaterItem)lc.NamingContainer;
      lc.Text =DataBinder.Eval(container.DataItem,"CategoryName");

       

      GridView:GridViewRowcontainer=(GridViewRow)lbGaugeMakeValue.NamingContainer;

      //绑定GaugeMakeValue字段的值
      lbGaugeMakeValue.Text=DataBinder.Eval(container.DataItem,"GaugeMakeValue").ToString();

       

      三、关于DataGrid的方法,可参见http://www.cnblogs.com/lovecherry/archive/2005/03/25/125526.html

      备注:

      作者:sweet_chenqiang

      本文引用自http://blog.csdn

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值