65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.09/5 (40投票s)

2004年5月30日

CPOL

2分钟阅读

viewsIcon

498805

downloadIcon

4345

运行时创建模板列和数据绑定。

引言

这是一段代码,您可以在运行时创建一个带有模板列的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列,并且附加代码包含许多用于控件的类,例如TextBoxCheckBoxLinkButtonPushButton等等...

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。 即使您在EditITemTemplateFooterTemplate以及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";
  }
}

就这样! 现在,网格已准备就绪。

© . All rights reserved.