摘要
当 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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

测试程序
我们拖曳一个 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">

2

执行程序,当 GridView 有数据时的画面如下

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