65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (7投票s)

2010 年 1 月 3 日

CPOL

2分钟阅读

viewsIcon

81182

downloadIcon

1994

一个扩展的 ASP.NET Gridview 控件,带有单元格点击事件。

下载代码和演示解决方案  - 184.4 KB

引言

ASP.NET GridView 是一个出色的控件,被广泛使用,但仍然缺乏一些功能。 本文演示了通过继承基本 GridView 类,重写和更改一些属性和行为来扩展 GridView 以添加单元格点击事件处理。

背景

经过一些研究,关于在 ASP.NET GridView 中处理单元格点击事件的资源似乎并不多。 我找到了一两篇文章,您需要在 GridViewRowDataBound() 事件中添加一些 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)

下一步是将点击事件和事件参数应用于子控件,即 GridViewTableCell。 这是通过重写基类的 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
© . All rights reserved.