何动态生成GridView的模版列TemplateField,并在模版列TemplateField中添加复选框CheckBox
首先,第一步,创建一个类MyTemplate.cs
... {
private string strColumnName;
private DataControlRowType dcrtColumnType;
public MyTemplate()
...{
//
// TODO: 在此处添加构造函数逻辑
//
}
/**//// <summary>
/// 动态添加模版列
/// </summary>
/// <param name="strColumnName">列名</param>
/// <param name="dcrtColumnType">列的类型</param>
public MyTemplate(string strColumnName, DataControlRowType dcrtColumnType)
...{
this.strColumnName = strColumnName;
this.dcrtColumnType = dcrtColumnType;
}
public void InstantiateIn(Control ctlContainer)
...{
switch (dcrtColumnType)
...{
case DataControlRowType.Header: //列标题
Literal ltr = new Literal();
ltr.Text = strColumnName;
ctlContainer.Controls.Add(ltr);
break;
case DataControlRowType.DataRow: //模版列内容——加载CheckBox
CheckBox cb = new CheckBox();
cb.ID = "CheckBox1";
cb.Checked = false;
ctlContainer.Controls.Add(cb);
break;
}
}
}
第二步,在绑定GridView方法中,生成模版列
/// 绑定生成GridView
/// </summary>
/// <param name="gdv">要绑定的GridView</param>
/// <param name="dtblDataSource">GridView的数据源</param>
/// <param name="strDataKey">GridView的DataKeyNames</param>
public static void GridViewBind(GridView gdv, DataTable dtblDataSource, string strDataKey)
... {
gdv.Columns.Clear();
gdv.AutoGenerateColumns = false;
gdv.DataSource = dtblDataSource;
gdv.DataKeyNames = new string[] ...{ strDataKey };
TemplateField tfColumn = new TemplateField();
tfColumn.ItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
gdv.Columns.Add(tfColumn);
//………………
gdv.DataBind();
}
这样模版列也可以动态生成啦!
==============================================================================================
动态添加绑定列很简单:例如:
GridView1.DataSourceID = "SqlDataSource1";
BoundField bf1 = new BoundField();
BoundField bf2 = new BoundField();
BoundField bf3 = new BoundField();
bf1.HeaderText = "Employee ID";
bf1.DataField = "EmployeeID";
bf1.ReadOnly = true;
bf1.SortExpression = "EmployeeID";
bf2.HeaderText = "First Name";
bf2.DataField = "FirstName";
bf2.SortExpression = "FirstName";
bf3.HeaderText = "Last Name";
bf3.DataField = "LastName";
bf3.SortExpression = "LastName";
CommandField cf = new CommandField();
cf.ButtonType = ButtonType.Button;
cf.ShowCancelButton = true;
cf.ShowEditButton = true;
GridView1.Columns.Add(bf1);
GridView1.Columns.Add(bf2);
GridView1.Columns.Add(bf3);
GridView1.Columns.Add(cf);
动态绑定模板列稍微复杂:
首先创建一个类,该类时继承了System.Web.UI.ITemplate
public class MyTemplate:System.Web.UI.ITemplate
{
private string proName;
public MyTemplate()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public string ProName//要绑定的数据源字段名称
{
set { proName = value; }
get { return proName; }
}
public void InstantiateIn(Control container)//关键实现这个方法
{
TextBox hi = new TextBox();
hi.Text = "";
hi.DataBinding += new EventHandler(hi_DataBinding);//创建数据绑定事件
container.Controls.Add(hi);
}
void hi_DataBinding(object sender, EventArgs e)
{
TextBox hi = (TextBox)sender;
GridViewRow container = (GridViewRow)hi.NamingContainer;
//关键位置
//使用DataBinder.Eval绑定数据
//ProName,MyTemplate的属性.在创建MyTemplate实例时,为此属性赋值(数据源字段)
hi.Attributes.Add("onclick", "alert('" + DataBinder.Eval(container.DataItem, ProName).ToString() + "');");
}
上面时创建了一个textbox的模板,
页面使用时
2.*.aspx页面后台cs代码
DataSet ds = null;
BLL.model_task bll = new BLL.model_task();
ds = bll.GetList(string.Empty);
TemplateField tf = new TemplateField();
tf.HeaderText = "自定义模板列";
MyTemplate mt = new MyTemplate();
mt.ProName = "ID";//数据源字段
tf.ItemTemplate = mt;
this.GridView1.Columns.Add(tf);
this.GridView1.DataSource = ds;
this.GridView1.DataBind();
这样就会添加了一个textbox的模板列;
==============================================================================================
动态添加列,关键是实现 ITemplate.InstantiateIn 方法。下面是一个添加 GridView 模板列的例子。
<%@ Page Language=/"C#/" %>
<%@ Import Namespace=/"System.Data/" %>
<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/"
/"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">
<script runat=/"server/">
ICollection CreateDataSource()
{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn(/"id/", typeof(Int32)));
dt.Columns.Add(new DataColumn(/"text/", typeof(string)));
for (int i = 0; i < 6; i++)
{
dr = dt.NewRow();
dr[0] = i;
dr[1] = /"列表项目 /" + i.ToString();
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}
public class GridViewTemplate : ITemplate
{
private DataControlRowType templateType;
private string columnName;
public GridViewTemplate( DataControlRowType type, string colname )
{
templateType = type;
columnName = colname;
}
public void InstantiateIn( System.Web.UI.Control container )
{
switch (templateType)
{
case DataControlRowType.Header:
Literal lc = new Literal();
lc.Text = columnName;
container.Controls.Add(lc);
break;
case DataControlRowType.DataRow:
DropDownList drr = new DropDownList();
drr.ID = /"dropdown/";
drr.AppendDataBoundItems = true;
drr.Items.Add(new ListItem(/"-----请选择------/",/"/"));
drr.Items.Add(new ListItem(/"AA/", /"a/"));
drr.Items.Add(new ListItem(/"BB/", /"b/"));
drr.Items.Add(new ListItem(/"CC/", /"c/"));
container.Controls.Add(drr);
break;
default:
break;
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
TemplateField customField = new TemplateField();
customField.ShowHeader = true;
customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, /"动态添加列/");
customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, /"/");
GridView1.Columns.Add(customField);
GridView1.DataSource = CreateDataSource();
GridView1.DataBind();
}
}
protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//可以在这里访问数据库的其它字段的值,可以设置默认选择项,具体应用,看自己的发挥了。
//下面只是例子,举一反三,不再费话了
DataRowView gv = (DataRowView)e.Row.DataItem;
int itemSeleted = Int32.Parse(gv.Row[/"id/"].ToString()) > 3 ? 0 : Int32.Parse(gv.Row[/"id/"].ToString());
DropDownList dr = (DropDownList)e.Row.FindControl(/"dropdown/");
dr.SelectedIndex = itemSeleted;
}
}
</script>
<html xmlns=/"http://www.w3.org/1999/xhtml/">
<head id=/"Head1/" runat=/"server/">
<title>GridView动态添加模板列的例子</title>
</head>
<body>
<form id=/"form1/" runat=/"server/">
<asp:GridView ID=/"GridView1/" runat=/"server/" AutoGenerateColumns=/"False/"
OnRowDataBound=/"GridView1_RowDataBound/">
<Columns>
<asp:BoundField HeaderText=/"标题/" DataField=/"text/"/>
</Columns>
</asp:GridView>
</form>
</body>
</html>