很长一段时间中,不管是使用DataGrid还是GridView都是通过拖放的方式。而这两天有个需求必须使用自定义的GridView,动态创建GridView的Columns,折腾了数小时,终于搞定,下面来说说具体的方法,希望能够帮助新手,也希望高手指点,毕竞我也够菜的;入正题:
一、来看看在VS2005自带的帮助文档中在Repeater使用动态创建的的方法:
要创建动态模板,请创建以后需要时可实例化的模板类。
创建模板类
-
创建实现System.Web.UI.ITemplate接口的新类。
-
您也可以将值传递到类的构造函数,类可以使用该值来确定要创建的模板类型(ItemTemplate、AlternatingItemTemplate等)。
ListItemType的参数。ListItemType枚举为Repeater、DataList和其他控件定义可能的模板类型。 -
在类中,实现InstantiateIn方法,该方法是ITemplate接口的成员。
此方法提供将文本实例和控件实例插入指定容器的方法。
-
在InstantiateIn方法中,为模板项创建控件,设置其属性,然后将它们添加到父级的Controls集合。
您可以通过传递到InstantiateIn方法的引用访问父控件。
Literal控件或LiteralControl控件的控件,设置它们的Text属性,然后向父集合添加这些控件。下面的代码示例阐释完整的模板类,该类显示某些静态文本(“Itemnumber:”)和计数器。计数器是名为
publicclassMyTemplate:ITemplateitemcount
的静态值(在VisualBasic中为共享值),在每次创建新项时都会递增。该类定义一个接受ListItemType枚举值以指示所创建模板类型的显式构造函数。根据所创建的模板类型,代码创建不同类型的控件并将其添加到父控件的Controls集合。最终结果是一个HTML表,其中的交替项模板具有不同的背景色。
...{
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;
}
}
使用动态模板有了可用的动态模板,就可以在代码中将其实例化了。
创建动态模板
-
创建动态模板的实例,假如合适的话,将一个项类型值传递给它。
-
将该实例分配给模板化控件的模板属性之一,如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
的方法:
lc.Text="<TR><TD>";
lc.DataBinding =newEventHandler(TemplateControl_DataBinding);
break;
在上例中,您添加到文本控件的Text属性的文本不同于前一示例。该示例只包含了项模板的表行和单元格的开头。您将在数据绑定事件处理程序中填写单元格和行。
下一步是创建事件处理程序,在控件处于数据绑定状态时将调用该事件处理程序。
为DataBinding事件创建处理程序-
创建属于模板类的方法,它还是该类的其他方法(如InstantiateIn)的对等方法。处理程序的名称必须与早期绑定事件时使用的名称相匹配。该方法应该具有以下签名:
privatevoidTemplateControl_DataBinding(objectsender,
System.EventArgse) -
通过执行以下操作获取对包含数据的DataItem对象的引用:
-
获取对模板项的引用。创建变量来保存该引用,然后将从控件的NamingContainer属性获取的值分配给它。
-
使用该引用来获取命名容器的(模板项的)DataItem属性。
-
从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>";
}
...{
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控件中的区别在于:
lc.Text =DataBinder.Eval(container.DataItem,"CategoryName");
//绑定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
-