运行时创建 DataGrid 模板列(使用 C#)和 DataBinding






4.09/5 (40投票s)
运行时创建模板列和数据绑定。
引言
这是一段代码,您可以在运行时创建一个带有模板列的DataGrid
,其中包含所有类型的模板(ItemTemplate
, EditItemTemplate
, HeaderTemplate
, FooterTemplate
),并将其与数据绑定。
动态创建带有绑定列甚至按钮列的网格很简单,但对于模板列来说,就比较复杂了。 这里有一个干净的解决方案。 :)
- 创建一个网格并声明列。
- 类文件应从
ITemplate
继承以创建模板。 - 将所有列添加到网格。
- 创建事件。
- 填充网格。
- 编写代码,在
ItemDataBound
事件中进行数据绑定列。 - 执行它!
创建网格并声明列
dgRt.ID="dgRt1";//Grid Settings
dgRt.AutoGenerateColumns=true;
dgRt.AllowPaging=true;
dgRt.ShowFooter=true;
dgRt.ShowHeader=true;
declare Columns:
BoundColumn bcl1 = new BoundColumn();
//columns Decalration
TemplateColumn tcl1 = new TemplateColumn();
TemplateColumn tcl2 = new TemplateColumn();
TemplateColumn tcl3 = new TemplateColumn();
TemplateColumn tcl4 = new TemplateColumn();
TemplateColumn tcl5 = new TemplateColumn();
TemplateColumn tcl6 = new TemplateColumn();
TemplateColumn tcl7 = new TemplateColumn();
TemplateColumn tcl8 = new TemplateColumn();
TemplateColumn tcl9 = new TemplateColumn();
TemplateColumn tcl10 = new TemplateColumn();
TemplateColumn tcl11 = new TemplateColumn();
EditCommandColumn ecol1=new EditCommandColumn();
从ITemplate继承的类文件,用于创建模板
您需要编写一个单独的类文件,该文件继承ITemplate
接口以创建模板。 我们必须创建一个方法InstantiateIn
,这是必要的,因为它继承自Itemplate
。 这为您提供了使用需要添加的指定控件创建的列。 为正在创建的控件创建一个事件DataBinding
,并指定所有需要在那里执行的操作。
在这里,我编写代码以创建带有下拉列表框的EditItemTemplate
列,并且附加代码包含许多用于控件的类,例如TextBox
、CheckBox
、LinkButton
、PushButton
等等...
public class CreateItemTemplateDDL : ITemplate
{
DataTable dtBind;
string strddlName;
string strDataValueField;
string strDataTextField;
在这里,我添加了用于创建带有值成员和文本成员的 DDL 的构造函数。
public CreateItemTemplateDDL(string DDLName,
string DataValueField, string DataTextField, DataTable DDLSource)
{
this.dtBind=DDLSource;
this.strDataValueField=DataValueField;
this.strDataTextField=DataTextField;
this.strddlName=DDLName;
}
这是用于声明正在添加的 DDL 的DataBinding
事件的代码。 这发生在绑定DataGrid
时。
public void InstantiateIn(Control objContainer)
{
DropDownList ddl = new DropDownList();
ddl.DataBinding+=new EventHandler(ddl_DataBinding);
objContainer.Controls.Add(ddl);
}
在这里,您可以分配 DDL 所需的所有属性和其他所有内容。
private void ddl_DataBinding(object sender, EventArgs e)
{
DropDownList ddl= (DropDownList)sender;
ddl.ID=strddlName;
ddl.DataSource=dtBind;
ddl.DataValueField=strDataValueField;
ddl.DataTextField=strDataTextField;
//ddl.DataBind();
}
更多控件类可在下载中找到。 同样,您可以通过调用指定的类将更多控件添加到您的DataGrid
中。
对于使用此类
tcl7.ItemTemplate= new CreateItemTemplateDDL("ddlGrid","ID","UserName",dt);
在这里,您为ItemTemplate
添加了 DDL。 即使您在EditITemTemplate
、FooterTemplate
以及HeaderTemplate
中也需要 DDL,也可以调用相同的 DDL。
将所有列添加到网格
dgRt.Columns.Add(tcl1);
dgRt.Columns.Add(tcl2);
dgRt.Columns.Add(tcl3);
dgRt.Columns.Add(tcl4);
dgRt.Columns.Add(tcl5);
dgRt.Columns.Add(tcl6);
dgRt.Columns.Add(tcl7);
dgRt.Columns.Add(tcl8);
dgRt.Columns.Add(tcl9);
dgRt.Columns.Add(tcl11);
dgRt.Columns.Add(ecol1);
dgRt.Columns.Add(bcl1);
通过此,您已将所有列添加到网格。
创建事件
创建网格后,如果您希望它有一些事件,例如您想绑定网格,则需要创建ItemDataBound
列,需要一个分页器,然后使用PagedindexChanged
事件。
dgRt.ItemDataBound+=new DataGridItemEventHandler(dgRt_ItemDataBound); dgRt.ItemCommand+=new DataGridCommandEventHandler(dgRt_ItemCommand); dgRt.PageIndexChanged+=new DataGridPageChangedEventHandler(dgRt_PageIndexChanged); dgRt.EditCommand+=new DataGridCommandEventHandler(dgRt_EditCommand); dgRt.UpdateCommand+=new DataGridCommandEventHandler(dgRt_UpdateCommand); dgRt.CancelCommand+=new DataGridCommandEventHandler(dgRt_CancelCommand);
填充网格
通过从数据库中提取数据来填充网格。
private void fillgrid() { SqlConnection cn = new SqlConnection(); SqlCommand cmd = new SqlCommand(); cmd.Connection=cn; cmd.CommandText="select * from SmpTable order by cm"; DataSet ds = new DataSet(); SqlDataAdapter adp = new SqlDataAdapter(cmd); cn.ConnectionString= "SERVER=SQLSERVERNAME;DATABASE=TestProject;UID=abcd;PWD=alskdjfh"; try { cn.Open(); adp.Fill(ds); dgRt.DataSource=ds.Tables[0]; dgRt.DataBind(); cn.Close(); } catch (Exception ex) { lblError.Text="Error Occured"; } }
编写代码,在ItemDataBound事件中进行数据绑定列
private void dgRt_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if((e.Item.ItemType==ListItemType.Item ) ||
(e.Item.ItemType==ListItemType.AlternatingItem))
{
DropDownList ddlSmp=((DropDownList)e.Item.Cells[7].FindControl("ddlGrid"));
ddlSmp.DataSource=.DataSource=dt;//your Data Table Name
ddlSmp.DataValueField="empid";
ddlSmp.DataTextField="EmpName";
}
}
就这样! 现在,网格已准备就绪。