【转】GridView动态添加模板列(并为其添加事件和自动绑定数据)
GridView动态添加模板列 这个case 经常会遇到,网上相关资料也不少,
但是关于如何动态为添加在模板列中的控件添加事件却没有。本文就是为解决这种情况而写。
代码如下:
GridViewTemplateDemo.aspx
<%@ Page Language="C#"AutoEventWireup="true"CodeFile="GridViewTemplateDemo.aspx.cs"Inherits="GridView_GridViewTemplateDemo"%><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><head id="Head1"runat="server"><title>GridView动态添加模板列的例子</title></head><body><form id="form1"runat="server"><asp:GridView ID="GridView1"runat="server"AutoGenerateColumns="False"></asp:GridView></form></body></html>
GridViewTemplateDemo.aspx.cs
usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Collections;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;publicpartialclassGridView_GridViewTemplateDemo : System.Web.UI.Page{privateDataTable getDateTable(){DataTable dt =newDataTable();dt.Columns.Add(newDataColumn("ID",typeof(Int32)));dt.Columns.Add(newDataColumn("Name",typeof(String)));DataRow dr = dt.NewRow();dr[0] = 1;dr[1] ="01";dt.Rows.Add(dr);dr = dt.NewRow();dr[0] = 2;dr[1] ="01011";dt.Rows.Add(dr);dr = dt.NewRow();dr[0] = 3;dr[1] ="0120";dt.Rows.Add(dr);dr = dt.NewRow();dr[0] = 4;dr[1] ="01001";dt.Rows.Add(dr);dr = dt.NewRow();dr[0] = 5;dr[1] ="0105";dt.Rows.Add(dr);returndt;}protectedoverridevoidOnInit(EventArgs e){TemplateField customField =newTemplateField();customField.ShowHeader =true;customField.HeaderTemplate =newGridViewTemplate(DataControlRowType.Header,"动态添加列");GridViewTemplate gvt =newGridViewTemplate(DataControlRowType.DataRow,"lbtn","Name");gvt.eh +=newGridViewTemplate.EventHandler(lbtn_Click);customField.ItemTemplate = gvt;GridView1.Columns.Add(customField);base.OnInit(e);}protectedvoidPage_Load(objectsender, EventArgs e){if(!IsPostBack){GridView1.DataSource = getDateTable();GridView1.DataBind();}}publicvoidlbtn_Click(objectsender, EventArgs e){ClientScript.RegisterStartupScript(GetType(),"test","alert('ok');",true);}}publicclassGridViewTemplate : ITemplate{publicdelegatevoidEventHandler(objectsender, EventArgs e);publiceventEventHandler eh;privateDataControlRowType templateType;privatestringcolumnName;privatestringcontrolID;publicGridViewTemplate(DataControlRowType type,stringcolname){templateType = type;columnName = colname;}publicGridViewTemplate(DataControlRowType type,stringcontrolID,stringcolname){templateType = type;this.controlID = controlID;columnName = colname;}publicvoidInstantiateIn(System.Web.UI.Control container){switch(templateType){caseDataControlRowType.Header:Literal lc =newLiteral();lc.Text = columnName;container.Controls.Add(lc);break;caseDataControlRowType.DataRow:LinkButton lbtn =newLinkButton();lbtn.ID =this.controlID;if(eh !=null){lbtn.Click +=newSystem.EventHandler(eh);}lbtn.DataBinding+=newSystem.EventHandler(lbtn_DataBinding);container.Controls.Add(lbtn);break;default:break;}}voidlbtn_DataBinding(objectsender, EventArgs e){LinkButton lbtn = senderasLinkButton;if(lbtn !=null){GridViewRow container = lbtn.NamingContainerasGridViewRow;if(container !=null){objectdataValue = DataBinder.Eval(container.DataItem, columnName);if(dataValue != DBNull.Value){lbtn.Text = dataValue.ToString();}}}}}