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">  
<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">  
    
       </asp:GridView>  
    
     </form>  
    
 </body>  
    
 </html>   

GridViewTemplateDemo.aspx.cs

using System;   
using System.Data;   
using System.Configuration;   
using System.Collections;   
using System.Web;   
using System.Web.Security;   
using System.Web.UI;   
using System.Web.UI.WebControls;   
using System.Web.UI.WebControls.WebParts;   
using System.Web.UI.HtmlControls;   
public partial class GridView_GridViewTemplateDemo : System.Web.UI.Page   
{   
    private DataTable getDateTable()   
    {   
        DataTable dt = new DataTable();   
        dt.Columns.Add(new DataColumn("ID", typeof(Int32)));   
        dt.Columns.Add(new DataColumn("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);   
        return dt;   
    }   
  
    protected override void OnInit(EventArgs e)   
    {   
        TemplateField customField = new TemplateField();   
  
        customField.ShowHeader = true;   
        customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "动态添加列");          
        GridViewTemplate gvt = new GridViewTemplate(DataControlRowType.DataRow, "lbtn", "Name");   
        gvt.eh += new GridViewTemplate.EventHandler(lbtn_Click);   
        customField.ItemTemplate = gvt;   
        GridView1.Columns.Add(customField);   
        base.OnInit(e);   
    }   
    
    protected void Page_Load(object sender, EventArgs e)   
    {   
        if (!IsPostBack)   
        {   
            GridView1.DataSource = getDateTable();   
            GridView1.DataBind();   
        }   
    }   
    
    public void lbtn_Click(object sender, EventArgs e)   
    {   
        ClientScript.RegisterStartupScript(GetType(), "test", "alert('ok');", true);   
    }   
}   
    
     public class GridViewTemplate : ITemplate   
    
     {   
         public delegate void EventHandler(object sender, EventArgs e);   
         public event EventHandler eh;   
    
         private DataControlRowType templateType;   
    
         private string columnName;   
         private string controlID;   
    
     
    
         public GridViewTemplate(DataControlRowType type, string colname)   
    
         {   
    
             templateType = type;   
    
             columnName = colname;   
    
         }   
         public GridViewTemplate(DataControlRowType type,string controlID, string colname)   
         {   
             templateType = type;   
             this.controlID = controlID;   
             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:               
                LinkButton lbtn = new LinkButton();   
                lbtn.ID = this.controlID;   
                if (eh != null)   
                {   
                    lbtn.Click += new System.EventHandler(eh);   
                }   
                lbtn.DataBinding+=new System.EventHandler(lbtn_DataBinding);   
                   
                container.Controls.Add(lbtn);   
                   
                break;   
            default:   
                break;   
        }   
    }   
     void lbtn_DataBinding(object sender, EventArgs e)   
     {   
         LinkButton lbtn = sender as LinkButton;   
         if (lbtn != null)   
         {   
             GridViewRow container = lbtn.NamingContainer as GridViewRow;   
             if (container != null)   
             {   
                 object dataValue = DataBinder.Eval(container.DataItem, columnName);   
                 if (dataValue != DBNull.Value)   
                 {   
                     lbtn.Text = dataValue.ToString();   
                 }   
             }   
         }   
     }   
  
   }  
posted on 2010-12-06 21:15  Mishchael  阅读(1731)  评论(0编辑  收藏  举报