扩展 ASP.NET GridView 单元格点击事件






4.71/5 (7投票s)
一个扩展的 ASP.NET Gridview 控件,带有单元格点击事件。
引言
ASP.NET GridView
是一个出色的控件,被广泛使用,但仍然缺乏一些功能。 本文演示了通过继承基本 GridView
类,重写和更改一些属性和行为来扩展 GridView
以添加单元格点击事件处理。
背景
经过一些研究,关于在 ASP.NET GridView
中处理单元格点击事件的资源似乎并不多。 我找到了一两篇文章,您需要在 GridView
的 RowDataBound()
事件中添加一些 JavaScript 函数。 我想要一个具有此功能的 开箱即用 的 gridview。 最后,我偶然发现了 Jonni Teemu Keiski 的一篇名为 开发一个可点击行的 GridView 的博客文章,并从那里开始,将相同的原则应用于 GridView
的单元格。
使用代码
添加一个设计器属性:启用单元格点击
由于我们选择使用通用控件,因此我们添加了一个属性,程序员可以设置该属性以在单击单元格时启用回发事件。
<DefaultValue(False)> _
Public Property EnableCellClick() As Boolean
Get
Dim ret As Boolean = False
Dim obj As Object = ViewState("EnableCellClick")
If obj IsNot Nothing Then
ret = CBool(obj)
End If
Return ret
End Get
Set(ByVal value As Boolean)
ViewState("EnableCellClick") = value
End Set
End Property
为单元格点击事件的参数添加一个类
为了返回被点击单元格的属性,我们创建一个新的自定义事件参数,它继承了基本事件参数类。 我们将在自定义事件处理程序 CellClicked()
中返回自定义事件参数,该事件处理程序将在下一节中创建。
Public Class GridViewCellClickedEventArgs _
Inherits EventArgs
Private mobjCell As TableCell
Private mobjRow As GridViewRow
Private mintColumnIndex As Integer
Public Sub New(ByVal Cell As TableCell, _
ByVal row As GridViewRow, _
ByVal ColumnIndex As Integer)
mobjCell = Cell
mobjRow = row
mintColumnIndex = ColumnIndex
End Sub
Public ReadOnly Property Cell() As TableCell
Get
Return mobjCell
End Get
End Property
Public ReadOnly Property Row() As GridViewRow
Get
Return mobjRow
End Get
End Property
Public ReadOnly Property ColumnIndex() As Integer
Get
Return mintColumnIndex
End Get
End Property
End Class
为单元格点击创建事件
在下一节中,我们将添加一个自定义事件,该事件将返回我们之前创建的自定义事件参数供程序员使用
Protected Sub XGridView1_CellClicked(ByVal sender As Object, _
ByVal e As CustomControls.GridViewCellClickedEventArgs) _
Handles XGridView1.CellClicked
'Do Something
Response.Write("Contents of cell clicked: " & e.Cell.Text)
Response.Write("Zero based column index of clicked cell: " & e.ColumnIndex)
End Sub
添加自定义事件
自定义事件包含 AddHandler
,一个 RemoveHandler
,它只是告诉调用从单元格的点击事件附加或删除给定的事件处理程序。
最后,我们将使用 RaiseEvent
实现来引发事件,如上一节(例如,XGridView1_CellClicked()
)。
Public Custom Event CellClicked As EventHandler(Of GridViewCellClickedEventArgs)
AddHandler(ByVal value As EventHandler(Of GridViewCellClickedEventArgs))
Events.AddHandler(CellClickedEventKey, value)
End AddHandler
RemoveHandler(ByVal value As EventHandler(Of GridViewCellClickedEventArgs))
Events.RemoveHandler(CellClickedEventKey, value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As GridViewCellClickedEventArgs)
Dim ev As EventHandler(Of GridViewCellClickedEventArgs) = _
TryCast(Events(CellClickedEventKey), _
EventHandler(Of GridViewCellClickedEventArgs))
If ev IsNot Nothing Then
ev(sender, e)
End If
End RaiseEvent
End Event
Protected Overridable Sub OnCellClicked(ByVal e As GridViewCellClickedEventArgs)
RaiseEvent CellClicked(Me, e)
End Sub
将基本控件(GridView)的属性添加到子控件(TableCell)
下一步是将点击事件和事件参数应用于子控件,即 GridView
的 TableCell
。 这是通过重写基类的 PrepareControlHierarchy()
方法来完成的。
For i As Integer = 0 To Rows.Count - 1
For j As Integer = 0 To Rows(i).Cells.Count - 1
'Row Index 'Column Index
Dim argsData As String = "cc" & ";" & Rows(i).RowIndex.ToString & _
";" & j.ToString
Me.Rows(i).Cells(j).Attributes.Add("onclick", _
Page.ClientScript.GetPostBackEventReference(Me, argsData))
Next
Next
处理回发
最后,我们重写 RaisePostBackEvent()
事件。 在此方法中,当服务器上发生回发时,将引发 GridView
的事件。 我们将重写该方法以从 EventArgument
中确定该事件是否由单击单元格引起。 从这里,我们使用事件数据创建一个新的 GridViewCellClickedEventArgs
实例,并将其传递给 OnCellClicked()
方法。
Protected Overrides Sub RaisePostBackEvent(ByVal eventArgument As String)
If eventArgument.StartsWith("cc") Then 'Cell click
Dim lcolIndices() As String = eventArgument.Split(";")
Dim lintRowIndex As Integer = lcolIndices(1).ToString()
Dim lintColumnIndex As Integer = lcolIndices(2).ToString()
Dim args As New GridViewCellClickedEventArgs(Me.Rows(lintRowIndex). _
Cells(lintColumnIndex), Me.Rows(lintRowIndex), lintColumnIndex)
OnCellClicked(args)
Else
MyBase.RaisePostBackEvent(eventArgument)
End If
End Sub
将控件添加到网页
<%@ Register Assembly="XGridView"
Namespace="CustomControls" TagPrefix="cc1" %>
<cc1:XGridView ID='XGridView' runat="server" EnableCellClick="True"
DataSourceID="XmlDataSource1" >
</cc1:XGridView>
请注意,我们在标记中启用了单元格点击,但也可以在 IDE 的属性设计器中进行设置。
向 CellClicked() 事件添加一些代码
Protected Sub XGridView_CellClicked(ByVal sender As Object, _
ByVal e As CustomControls.GridViewCellClickedEventArgs) _
Handles XGridView.CellClicked
lblResult.Text = "Index of the cell clicked was: " & e.ColumnIndex.ToString
lblResult0.Text = "Value of cell clicked: " & e.Cell.Text.ToString
lblResult1.Text = "Index of the row clicked was: " & e.Row.RowIndex
End Sub