天天看点

GridView动态添加模板列

转自:http://blog.csdn.net/Sandy945/article/details/4397142

GridView动态添加模板列 这个case 经常会遇到,网上相关资料也不少,

但是关于如何动态为添加在模板列中的控件添加事件却没有。本文就是为解决这种情况而写。

代码如下:

GridViewTemplateDemo.aspx

[xhtml] view plain copy

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="GridViewTemplateDemo.aspx.cs" Inherits="GridView_GridViewTemplateDemo" %>  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3. <html xmlns="http://www.w3.org/1999/xhtml" >  
  4. <head id="Head1" runat="server">  
  5.      <title>GridView动态添加模板列的例子</title>  
  6.  </head>  
  7.  <body>  
  8.      <form id="form1" runat="server">  
  9.        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">  
  10.        </asp:GridView>  
  11.      </form>  
  12.  </body>  
  13.  </html>   

GridViewTemplateDemo.aspx.cs

[c-sharp] view plain copy

  1. using System;  
  2. using System.Data;  
  3. using System.Configuration;  
  4. using System.Collections;  
  5. using System.Web;  
  6. using System.Web.Security;  
  7. using System.Web.UI;  
  8. using System.Web.UI.WebControls;  
  9. using System.Web.UI.WebControls.WebParts;  
  10. using System.Web.UI.HtmlControls;  
  11. public partial class GridView_GridViewTemplateDemo : System.Web.UI.Page  
  12. {  
  13.     private DataTable getDateTable()  
  14.     {  
  15.         DataTable dt = new DataTable();  
  16.         dt.Columns.Add(new DataColumn("ID", typeof(Int32)));  
  17.         dt.Columns.Add(new DataColumn("Name", typeof(String)));  
  18.         DataRow dr = dt.NewRow();  
  19.         dr[0] = 1;  
  20.         dr[1] = "01";  
  21.         dt.Rows.Add(dr);  
  22.         dr = dt.NewRow();  
  23.         dr[0] = 2;  
  24.         dr[1] = "01011";  
  25.         dt.Rows.Add(dr);  
  26.         dr = dt.NewRow();  
  27.         dr[0] = 3;  
  28.         dr[1] = "0120";  
  29.         dt.Rows.Add(dr);  
  30.         dr = dt.NewRow();  
  31.         dr[0] = 4;  
  32.         dr[1] = "01001";  
  33.         dt.Rows.Add(dr);  
  34.         dr = dt.NewRow();  
  35.         dr[0] = 5;  
  36.         dr[1] = "0105";  
  37.         dt.Rows.Add(dr);  
  38.         return dt;  
  39.     }  
  40.     protected override void OnInit(EventArgs e)  
  41.     {  
  42.         TemplateField customField = new TemplateField();  
  43.         customField.ShowHeader = true;  
  44.         customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "动态添加列");         
  45.         GridViewTemplate gvt = new GridViewTemplate(DataControlRowType.DataRow, "lbtn", "Name");  
  46.         gvt.eh += new GridViewTemplate.EventHandler(lbtn_Click);  
  47.         customField.ItemTemplate = gvt;  
  48.         GridView1.Columns.Add(customField);  
  49.         base.OnInit(e);  
  50.     }  
  51.     protected void Page_Load(object sender, EventArgs e)  
  52.     {  
  53.         if (!IsPostBack)  
  54.         {  
  55.             GridView1.DataSource = getDateTable();  
  56.             GridView1.DataBind();  
  57.         }  
  58.     }  
  59.     public void lbtn_Click(object sender, EventArgs e)  
  60.     {  
  61.         ClientScript.RegisterStartupScript(GetType(), "test", "alert('ok');", true);  
  62.     }  
  63. }  
  64.      public class GridViewTemplate : ITemplate  
  65.      {  
  66.          public delegate void EventHandler(object sender, EventArgs e);  
  67.          public event EventHandler eh;  
  68.          private DataControlRowType templateType;  
  69.          private string columnName;  
  70.          private string controlID;  
  71.          public GridViewTemplate(DataControlRowType type, string colname)  
  72.          {  
  73.              templateType = type;  
  74.              columnName = colname;  
  75.          }  
  76.          public GridViewTemplate(DataControlRowType type,string controlID, string colname)  
  77.          {  
  78.              templateType = type;  
  79.              this.controlID = controlID;  
  80.              columnName = colname;  
  81.          }  
  82.     public void InstantiateIn(System.Web.UI.Control container)   
  83.     {  
  84.         switch (templateType)  
  85.         {  
  86.             case DataControlRowType.Header:  
  87.                 Literal lc = new Literal();  
  88.                 lc.Text = columnName;  
  89.                 container.Controls.Add(lc);  
  90.                 break;  
  91.             case DataControlRowType.DataRow:              
  92.                 LinkButton lbtn = new LinkButton();  
  93.                 lbtn.ID = this.controlID;  
  94.                 if (eh != null)  
  95.                 {  
  96.                     lbtn.Click += new System.EventHandler(eh);  
  97.                 }  
  98.                 lbtn.DataBinding+=new System.EventHandler(lbtn_DataBinding);  
  99.                 container.Controls.Add(lbtn);  
  100.                 break;  
  101.             default:  
  102.                 break;  
  103.         }  
  104.     }  
  105.      void lbtn_DataBinding(object sender, EventArgs e)  
  106.      {  
  107.          LinkButton lbtn = sender as LinkButton;  
  108.          if (lbtn != null)  
  109.          {  
  110.              GridViewRow container = lbtn.NamingContainer as GridViewRow;  
  111.              if (container != null)  
  112.              {  
  113.                  object dataValue = DataBinder.Eval(container.DataItem, columnName);  
  114.                  if (dataValue != DBNull.Value)  
  115.                  {  
  116.                      lbtn.Text = dataValue.ToString();  
  117.                  }  
  118.              }  
  119.          }  
  120.      }  
  121.    }