GridView动态添加模板列 这个case 经常会遇到,网上相关资料也不少,
但是关于如何动态为添加在模板列中的控件添加事件却没有。本文就是为解决这种情况而写。
代码如下:
GridViewTemplateDemoVB.aspx
GridViewTemplateDemoVB.aspx.vb
- Imports System.Data
- Partial Class GridView_GridViewTemplateDemoVB
- Inherits System.Web.UI.Page
- Private Function CreateDataSource() As ICollection
- Dim dt As New DataTable()
- Dim dr As DataRow
- dt.Columns.Add(New DataColumn("id", GetType(Int32)))
- dt.Columns.Add(New DataColumn("Name", GetType(String)))
- For i As Integer = 0 To 5
- dr = dt.NewRow()
- dr(0) = i
- dr(1) = "Name" & i.ToString()
- dt.Rows.Add(dr)
- Next
- Return dt.DefaultView
- End Function
- Protected Overloads Overrides Sub OnInit(ByVal e As EventArgs)
- Dim customField As New TemplateField()
- customField.ShowHeader = True
- customField.HeaderTemplate = New GridViewTemplate(DataControlRowType.Header, "动态添加列")
- Dim gvt As New GridViewTemplate(DataControlRowType.DataRow, "lbtn", "Name")
- AddHandler gvt.eh, AddressOf lbtn_Click
- customField.ItemTemplate = gvt
- gv.Columns.Add(customField)
- MyBase.OnInit(e)
- End Sub
- Protected Sub lbtn_Click(ByVal sender As Object, ByVal e As System.EventArgs)
- ' do sth
- Response.Write("PageLoad: lbtn_Click")
- End Sub
- Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
- If Not IsPostBack Then
- gv.DataSource = CreateDataSource()
- gv.DataBind()
- End If
- End Sub
- End Class
- Public Class GridViewTemplate
- Implements ITemplate
- Public Delegate Sub EventHandler(ByVal sender As Object, ByVal e As EventArgs)
- Public Event eh As EventHandler
- Private templateType As DataControlRowType
- Private columnName As String
- Private controlID As String
- Public Sub New(ByVal type As DataControlRowType, ByVal colname As String)
- templateType = type
- columnName = colname
- End Sub
- Public Sub New(ByVal type As DataControlRowType, ByVal controlID As String, ByVal colname As String)
- templateType = type
- Me.controlID = controlID
- columnName = colname
- End Sub
- Sub RaiseSampleEvent(ByVal sender As Object, ByVal e As EventArgs)
- RaiseEvent eh(sender, e)
- End Sub
- Sub InstantiateIn(ByVal container As Control) Implements ITemplate.InstantiateIn
- Select Case templateType
- Case DataControlRowType.Header
- Dim lc As New Literal()
- lc.Text = columnName
- container.Controls.Add(lc)
- Exit Select
- Case DataControlRowType.DataRow
- Dim lbtn As New LinkButton()
- lbtn.ID = Me.controlID
- If ehEvent IsNot Nothing Then
- AddHandler lbtn.Click, AddressOf RaiseSampleEvent
- End If
- AddHandler lbtn.DataBinding, AddressOf lbtn_DataBinding
- container.Controls.Add(lbtn)
- Exit Select
- Case Else
- Exit Select
- End Select
- End Sub
- Private Sub lbtn_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
- Dim lbtn As LinkButton = TryCast(sender, LinkButton)
- If lbtn IsNot Nothing Then
- Dim container As GridViewRow = TryCast(lbtn.NamingContainer, GridViewRow)
- If container IsNot Nothing Then
- Dim dataValue As Object = DataBinder.Eval(container.DataItem, columnName)
- If Not IsDBNull(dataValue) Then
- lbtn.Text = dataValue.ToString()
- End If
- End If
- End If
- End Sub
- End Class
- <%@ Page Language="VB" AutoEventWireup="false" CodeFile="GridViewTemplateDemoVB.aspx.vb" Inherits="GridView_GridViewTemplateDemoVB" %>
- <!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 runat="server">
- <title>GridView动态添加模板列的例子</title>
- </head>
- <body>
- <form id="form1" runat="server">
- <asp:gridview ID="gv" AutoGenerateColumns="false" runat="server"></asp:gridview>
- </form>
- </body>
- </html>