摘要
当 GridView 系结的 DataSource 资料笔数为 0 时,会依 EmptyDataTemplate 及 EmptyDataText 的设定来显示无数据的状态。若我们希望 GridView 在无数据时,可以显示字段标题,有一种作法是在 EmptyDataTemplate 中手动在设定一个标题列,不过这种作法很麻烦。GridView 控件可不可以直接透过属性设定就可以在无数据显示字段标题呢?答案是肯定的,本文将扩展 GridView 控件来达成此需求。
扩展 GridView 控件
我们继承 GridView 命名为 TBGridView,新增一个 EmptyShowHeader 属性,来设定无数据时是否显示字段标题。覆写 CreateChildControls 方法,当 Mybase.CreateChildControls 传回 0 时,表示 DataSource 无数据,此时就呼叫 CreateEmptyTable 方法来建立无数据只显示标题的表格。
在 CreateEmptyTable 方法中,会复制 Columns 的集合,来输出所有字段的标题列。接下来会在标题列下方新增一列合并的数据列,用来显示无数据时的显示文字,即显示 EmptyDataText 属性值。
测试程序
我们拖曳一个 TBGridView 控件至页面上,设定 EmptyShowHeader="True"。
执行程序,当 GridView 有数据时的画面如下

而当 GridView 无数据时,就会显示字段列及无数据的显示文字(EmptyDataText)。

当 GridView 系结的 DataSource 资料笔数为 0 时,会依 EmptyDataTemplate 及 EmptyDataText 的设定来显示无数据的状态。若我们希望 GridView 在无数据时,可以显示字段标题,有一种作法是在 EmptyDataTemplate 中手动在设定一个标题列,不过这种作法很麻烦。GridView 控件可不可以直接透过属性设定就可以在无数据显示字段标题呢?答案是肯定的,本文将扩展 GridView 控件来达成此需求。
扩展 GridView 控件
我们继承 GridView 命名为 TBGridView,新增一个 EmptyShowHeader 属性,来设定无数据时是否显示字段标题。覆写 CreateChildControls 方法,当 Mybase.CreateChildControls 传回 0 时,表示 DataSource 无数据,此时就呼叫 CreateEmptyTable 方法来建立无数据只显示标题的表格。
在 CreateEmptyTable 方法中,会复制 Columns 的集合,来输出所有字段的标题列。接下来会在标题列下方新增一列合并的数据列,用来显示无数据时的显示文字,即显示 EmptyDataText 属性值。
1
Imports System
2
Imports System.Collections.Generic
3
Imports System.ComponentModel
4
Imports System.Text
5
Imports System.Web
6
Imports System.Web.UI
7
Imports System.Web.UI.WebControls
8
Imports System.Drawing
9
10
Namespace WebControls
11
< _
12
Description("TBGridView 控件"), _
13
ToolboxData("<{0}:TBGridView runat=server></{0}:TBGridView>") _
14
> _
15
Public Class TBGridView
16
Inherits GridView
17
Private FEmptyShowHeader As Boolean = True
18
19
''' <summary>
20
''' 无数据时是否显示字段标题。
21
''' </summary>
22
Public Property EmptyShowHeader() As Boolean
23
Get
24
Return FEmptyShowHeader
25
End Get
26
Set(ByVal value As Boolean)
27
FEmptyShowHeader = value
28
End Set
29
End Property
30
31
32
''' <summary>
33
''' 建立子控件。
34
''' </summary>
35
''' <param name="dataSource">控件的数据来源。</param>
36
''' <param name="dataBinding">true 指示子控件系结至数据,否则为 false。</param>
37
''' <returns>建立的数据列数目。</returns>
38
Protected Overrides Function CreateChildControls(ByVal DataSource As System.Collections.IEnumerable, ByVal DataBinding As Boolean) As Integer
39
Dim iRowCount As Integer
40
Dim oTable As Table
41
42
iRowCount = MyBase.CreateChildControls(DataSource, DataBinding)
43
If Me.EmptyShowHeader AndAlso (iRowCount = 0) Then
44
oTable = CreateEmptyTable()
45
Me.Controls.Clear()
46
Me.Controls.Add(oTable)
47
End If
48
End Function
49
50
''' <summary>
51
''' 建立无数据只显示标题的表格。
52
''' </summary>
53
Private Function CreateEmptyTable() As Table
54
Dim oTable As Table
55
Dim oGridViewRow As GridViewRow
56
Dim oCell As TableCell
57
Dim iCount As Integer
58
Dim e As GridViewRowEventArgs
59
60
oTable = MyBase.CreateChildTable()
61
iCount = Me.Columns.Count - 1
62
63
'建立标题列
64
oGridViewRow = MyBase.CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal)
65
Dim oFields(iCount) As DataControlField
66
Me.Columns.CopyTo(oFields, 0) '取得目前定义 Columns 复本
67
Me.InitializeRow(oGridViewRow, oFields) '资料列初始化
68
e = New GridViewRowEventArgs(oGridViewRow)
69
Me.OnRowCreated(e) '引发 RowCreated 事件
70
oTable.Rows.Add(oGridViewRow)
71
72
'建立空白的数据列
73
oGridViewRow = New GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal)
74
oCell = New TableCell()
75
oCell.ColumnSpan = oFields.Length
76
oCell.Width = Unit.Percentage(100)
77
oCell.Text = Me.EmptyDataText
78
oCell.HorizontalAlign = UI.WebControls.HorizontalAlign.Center
79
oGridViewRow.Cells.Add(oCell)
80
oTable.Rows.Add(oGridViewRow)
81
82
Return oTable
83
End Function
84
85
End Class
86
End Namespace
Imports System2
Imports System.Collections.Generic3
Imports System.ComponentModel4
Imports System.Text5
Imports System.Web6
Imports System.Web.UI7
Imports System.Web.UI.WebControls8
Imports System.Drawing9

10
Namespace WebControls11
< _12
Description("TBGridView 控件"), _13
ToolboxData("<{0}:TBGridView runat=server></{0}:TBGridView>") _14
> _15
Public Class TBGridView16
Inherits GridView17
Private FEmptyShowHeader As Boolean = True18

19
''' <summary>20
''' 无数据时是否显示字段标题。21
''' </summary>22
Public Property EmptyShowHeader() As Boolean23
Get24
Return FEmptyShowHeader25
End Get26
Set(ByVal value As Boolean)27
FEmptyShowHeader = value28
End Set29
End Property30

31

32
''' <summary>33
''' 建立子控件。34
''' </summary>35
''' <param name="dataSource">控件的数据来源。</param>36
''' <param name="dataBinding">true 指示子控件系结至数据,否则为 false。</param>37
''' <returns>建立的数据列数目。</returns>38
Protected Overrides Function CreateChildControls(ByVal DataSource As System.Collections.IEnumerable, ByVal DataBinding As Boolean) As Integer39
Dim iRowCount As Integer40
Dim oTable As Table41

42
iRowCount = MyBase.CreateChildControls(DataSource, DataBinding)43
If Me.EmptyShowHeader AndAlso (iRowCount = 0) Then44
oTable = CreateEmptyTable()45
Me.Controls.Clear()46
Me.Controls.Add(oTable)47
End If48
End Function49

50
''' <summary>51
''' 建立无数据只显示标题的表格。52
''' </summary>53
Private Function CreateEmptyTable() As Table54
Dim oTable As Table55
Dim oGridViewRow As GridViewRow56
Dim oCell As TableCell57
Dim iCount As Integer58
Dim e As GridViewRowEventArgs59

60
oTable = MyBase.CreateChildTable()61
iCount = Me.Columns.Count - 162

63
'建立标题列64
oGridViewRow = MyBase.CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal)65
Dim oFields(iCount) As DataControlField66
Me.Columns.CopyTo(oFields, 0) '取得目前定义 Columns 复本67
Me.InitializeRow(oGridViewRow, oFields) '资料列初始化 68
e = New GridViewRowEventArgs(oGridViewRow)69
Me.OnRowCreated(e) '引发 RowCreated 事件70
oTable.Rows.Add(oGridViewRow)71

72
'建立空白的数据列73
oGridViewRow = New GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal)74
oCell = New TableCell()75
oCell.ColumnSpan = oFields.Length76
oCell.Width = Unit.Percentage(100)77
oCell.Text = Me.EmptyDataText78
oCell.HorizontalAlign = UI.WebControls.HorizontalAlign.Center79
oGridViewRow.Cells.Add(oCell)80
oTable.Rows.Add(oGridViewRow)81

82
Return oTable83
End Function84

85
End Class86
End Namespace测试程序
我们拖曳一个 TBGridView 控件至页面上,设定 EmptyShowHeader="True"。
1
<bee:TBGridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1"
2
EmptyShowHeaer="True" EmptyDataText="沒有資料錄可顯示。" AllowPaging="True" DataKeyNames="EmployeeID" CellPadding="4" ForeColor="#333333" GridLines="None">
<bee:TBGridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1"2
EmptyShowHeaer="True" EmptyDataText="沒有資料錄可顯示。" AllowPaging="True" DataKeyNames="EmployeeID" CellPadding="4" ForeColor="#333333" GridLines="None">执行程序,当 GridView 有数据时的画面如下
而当 GridView 无数据时,就会显示字段列及无数据的显示文字(EmptyDataText)。

浙公网安备 33010602011771号