摘要
延续前面「GridView+FormView 示范数据 新增/修改/删除(进阶篇:服务器控件)」的文章,文章后记有提及若要达到零程序代码要求,其中一个要件就是需要扩展 CommandField 类别,在 CommandField 的 Header 的部分加入「新增」钮,本文就是在说明如何扩展 CommandField 类别达到此需求。

扩展 CommandField 类别
我们的需求是在 CommandField 的 Header 加入新增钮,作法是继承 CommandField 下来命名为 TBCommandField,新增 ShowHeaderInsertButton 属性,来设定 Header 是否显示新增钮。TBCommandField 的程序代码如下,作法是覆写 InitializeCell 方法,若为 Header 且有设定 ShowHeaderInsertButton="True" 则利用 AddButtonToCell 私有方法来加入「新增」钮。

  1Imports System
  2Imports System.Collections.Generic
  3Imports System.ComponentModel
  4Imports System.Text
  5Imports System.Web
  6Imports System.Web.UI
  7Imports System.Web.UI.WebControls
  8Imports System.Globalization
  9
 10Namespace WebControls
 11    Public Class TBCommandField
 12        Inherits CommandField
 13
 14        Private FShowHeaderInsertButton As Boolean = False
 15
 16        ''' <summary>
 17        ''' 初始化储存格。
 18        ''' </summary>
 19        ''' <param name="cell">要初始化的储存格。</param>
 20        ''' <param name="cellType">储存格类型。</param>
 21        ''' <param name="rowState">储存格状态。</param>
 22        ''' <param name="rowIndex">数据列之以零起始的索引。</param>

 23        Public Overrides Sub InitializeCell(ByVal cell As DataControlFieldCell, ByVal cellType As DataControlCellType, ByVal rowState As DataControlRowState, ByVal rowIndex As Integer)
 24            MyBase.InitializeCell(cell, cellType, rowState, rowIndex)
 25
 26            If Me.ShowHeaderInsertButton AndAlso (cellType = DataControlCellType.Header) Then
 27                '标题加入新增钮
 28                AddButtonToCell(cell, "New"Me.InsertText, Me.CausesValidation, Me.ValidationGroup, rowIndex, Me.InsertImageUrl)
 29            End If
 30        End Sub

 31
 32        ''' <summary>
 33        ''' 标题储存格是否显示新增钮。
 34        ''' </summary>

 35        < _
 36        Description("标题储存格是否显示新增钮"), _
 37        DefaultValue(False) _
 38        > _
 39        Public Property ShowHeaderInsertButton() As Boolean
 40            Get
 41                Return FShowHeaderInsertButton
 42            End Get
 43            Set(ByVal value As Boolean)
 44                If FShowHeaderInsertButton <> value Then
 45                    FShowHeaderInsertButton = value
 46                    Me.OnFieldChanged()
 47                End If
 48            End Set
 49        End Property

 50
 51        ''' <summary>
 52        ''' 储存格加入按钮。
 53        ''' </summary>
 54        ''' <param name="Cell">储存格。</param>
 55        ''' <param name="CommandName">按钮命令。</param>
 56        ''' <param name="ButtonText">按钮文字。</param>
 57        ''' <param name="CausesValidation">是否执行验证。</param>
 58        ''' <param name="ValidationGroup">验证控件所属之验证群组的名称。</param>
 59        ''' <param name="RowIndex">列索引。</param>
 60        ''' <param name="ImageUrl">影像网址。</param>

 61        Private Sub AddButtonToCell(ByVal Cell As DataControlFieldCell, ByVal CommandName As StringByVal ButtonText As StringByVal CausesValidation As BooleanByVal ValidationGroup As StringByVal RowIndex As IntegerByVal ImageUrl As String)
 62            Dim oButtonControl As IButtonControl
 63
 64            Select Case Me.ButtonType
 65                Case ButtonType.Button
 66                    oButtonControl = New Button()
 67                    Exit Select
 68                Case ButtonType.Link
 69                    oButtonControl = New LinkButton()
 70                Case Else
 71                    oButtonControl = New ImageButton()
 72                    DirectCast(oButtonControl, ImageButton).ImageUrl = ImageUrl
 73                    Exit Select
 74            End Select
 75            oButtonControl.Text = ButtonText
 76            oButtonControl.CommandName = CommandName
 77            oButtonControl.CommandArgument = RowIndex.ToString(CultureInfo.InvariantCulture)
 78            oButtonControl.CausesValidation = CausesValidation
 79            oButtonControl.ValidationGroup = ValidationGroup
 80            Cell.Controls.Add(DirectCast(oButtonControl, WebControl))
 81        End Sub

 82
 83        ''' <summary>
 84        ''' 建立新的 TBCommandField 对象。 
 85        ''' </summary>

 86        Protected Overrides Function CreateField() As DataControlField
 87            Return New TBCommandField()
 88        End Function

 89
 90        ''' <summary>
 91        ''' 将目前 TBCommandField 对象的属性复制到指定之 DataControlField 对象。
 92        ''' </summary>
 93        ''' <param name="newField">目的 DataControlField 对象。</param>

 94        Protected Overrides Sub CopyProperties(ByVal NewField As DataControlField)
 95            Dim oNewField As TBCommandField
 96
 97            oNewField = DirectCast(NewField, TBCommandField)
 98            oNewField.ShowHeaderInsertButton = Me.ShowHeaderInsertButton
 99            MyBase.CopyProperties(NewField)
100        End Sub

101
102    End Class

103End Namespace

使用 TBCommandField 类别
因为 GridView.Columns 的属性编辑器不支持我们改写 TBCommandField,故只能切换至 aspx 程序代码中手动加入。

<bee:TBCommandField ShowHeaderInsertButton="True" InsertText="新增" ShowEditButton="True" ShowDeleteButton="True" ButtonType="Button"  />

切换至设计画面,就可以看到 TBCommandField 的 Header 出现「新增」钮。




备注:若要让 GridView 的字段编辑器支持 TBCommandField,需自订 GridView.Columns 的属性编辑器。
posted on 2008-05-14 00:00  jeff377  阅读(1684)  评论(4编辑  收藏  举报