摘要
延续前面「GridView+FormView 示范数据新增/修改/删除(进阶篇:服务器控件)」的文章,文章后记有提及若要达到零程序代码要求,上篇已实作「扩展 CommandField 类别 - Header 加入新增钮」解决其中一个问题。另一个问题就要扩展 TextBox 控件,让 TextBox 可以自行判断 FormView 的 CurrentMode 来决定 TextBox 的启用状态,本文接下来就是来说明如何扩展 TextBox 控件来达到此需求。
TBFormViewModeStatus 类别
首先我们先定义 TBFormViewModeStatus 类别,此类别是用来设定控件在每种 FormViewMode 的状态。TBFormViewModeStatus 类别具有 InsertMode、EditMode、BrowseMode 三个属性,分别用来设定 FormViewMode 为 Insert、Edit、ReadOnly 三种情形时,TextBox 控件的启用状态。
扩展 TBTextBox 控件
接下来就是改写 TextBox 控件,我们继承 TextBox 类别命名为 TBTextBox,加入一个 FormViewModeStatus 属性( TBFormViewModeStatus 型别),用来设定控件在每种 FormViewMode 的状态,例如设定 FormViewModeStatus.InsertMode 可以设定 FormViewMode.Insert 情形时,控件状态为「不设定、启用、不启用」三择一。主要的作法是覆写 OnPreRender 方法,在此方法中去呼叫 DoFormViewModeStatus 方法,自行判断 TextBox 所属 FormView 的 CurrentMode 来决定本身的状态。
使用 TBTextBox 控件
将 TBTextBox 放置 FormView 的 EditItemTemplate(Edit 及 Insert 共享 Template,即 InsertItemTemplate=EditItemTemplate)中,在 TBTextBox 的属性窗口中就可以直接设定 FormViewModeStatus 属性即可。如此就可以不用麻烦的判断 FormView 的 CurrentMode,又要 FindControl 来做相关设定,就可以真正达到零程序代码的要求了。

<bee:TBTextBox ID="txtEmployeeID" runat="server" Text='<%# Bind("EmployeeID") %>'>
<FormViewModeStatus InsertMode="Enable" EditMode="Disable" />
</bee:TBTextBox>
延续前面「GridView+FormView 示范数据新增/修改/删除(进阶篇:服务器控件)」的文章,文章后记有提及若要达到零程序代码要求,上篇已实作「扩展 CommandField 类别 - Header 加入新增钮」解决其中一个问题。另一个问题就要扩展 TextBox 控件,让 TextBox 可以自行判断 FormView 的 CurrentMode 来决定 TextBox 的启用状态,本文接下来就是来说明如何扩展 TextBox 控件来达到此需求。
TBFormViewModeStatus 类别
首先我们先定义 TBFormViewModeStatus 类别,此类别是用来设定控件在每种 FormViewMode 的状态。TBFormViewModeStatus 类别具有 InsertMode、EditMode、BrowseMode 三个属性,分别用来设定 FormViewMode 为 Insert、Edit、ReadOnly 三种情形时,TextBox 控件的启用状态。
1
''' <summary>
2
''' 控件状态列举。
3
''' </summary>
4
Public Enum EControlStatus
5
''' <summary>
6
''' 不设定。
7
''' </summary>
8
NotSet = 0
9
''' <summary>
10
''' 启用。
11
''' </summary>
12
Enable = 1
13
''' <summary>
14
''' 不启用。
15
''' </summary>
16
Disable = 2
17
End Enum
18
19
''' <summary>
20
''' 依 FormViewMode 来设定控件状态。
21
''' </summary>
22
< _
23
Serializable(), _
24
TypeConverter(GetType(ExpandableObjectConverter)) _
25
> _
26
Public Class TBFormViewModeStatus
27
Private FInsertMode As EControlStatus = EControlStatus.NotSet
28
Private FEditMode As EControlStatus = EControlStatus.NotSet
29
Private FBrowseMode As EControlStatus = EControlStatus.NotSet
30
31
''' <summary>
32
''' 在新增模式(FormViewMode=Insert)的控件状态。
33
''' </summary>
34
< _
35
NotifyParentProperty(True), _
36
DefaultValue(GetType(EControlStatus), "NotSet") _
37
> _
38
Public Property InsertMode() As EControlStatus
39
Get
40
Return FInsertMode
41
End Get
42
Set(ByVal value As EControlStatus)
43
FInsertMode = value
44
End Set
45
End Property
46
47
''' <summary>
48
''' 在编辑模式(FormViewMode=Edit)的控件状态。
49
''' </summary>
50
< _
51
NotifyParentProperty(True), _
52
DefaultValue(GetType(EControlStatus), "NotSet") _
53
> _
54
Public Property EditMode() As EControlStatus
55
Get
56
Return FEditMode
57
End Get
58
Set(ByVal value As EControlStatus)
59
FEditMode = value
60
End Set
61
End Property
62
63
''' <summary>
64
''' 在浏览模式(FormViewMode=ReadOnly)的控件状态。
65
''' </summary>
66
< _
67
NotifyParentProperty(True), _
68
DefaultValue(GetType(EControlStatus), "NotSet") _
69
> _
70
Public Property BrowseMode() As EControlStatus
71
Get
72
Return FBrowseMode
73
End Get
74
Set(ByVal value As EControlStatus)
75
FBrowseMode = value
76
End Set
77
End Property
78
End Class
''' <summary>2
''' 控件状态列举。3
''' </summary>4
Public Enum EControlStatus5
''' <summary>6
''' 不设定。7
''' </summary>8
NotSet = 09
''' <summary>10
''' 启用。11
''' </summary>12
Enable = 113
''' <summary>14
''' 不启用。15
''' </summary>16
Disable = 217
End Enum18

19
''' <summary>20
''' 依 FormViewMode 来设定控件状态。21
''' </summary>22
< _23
Serializable(), _24
TypeConverter(GetType(ExpandableObjectConverter)) _25
> _26
Public Class TBFormViewModeStatus27
Private FInsertMode As EControlStatus = EControlStatus.NotSet28
Private FEditMode As EControlStatus = EControlStatus.NotSet29
Private FBrowseMode As EControlStatus = EControlStatus.NotSet30

31
''' <summary>32
''' 在新增模式(FormViewMode=Insert)的控件状态。33
''' </summary>34
< _35
NotifyParentProperty(True), _36
DefaultValue(GetType(EControlStatus), "NotSet") _37
> _38
Public Property InsertMode() As EControlStatus39
Get40
Return FInsertMode41
End Get42
Set(ByVal value As EControlStatus)43
FInsertMode = value44
End Set45
End Property46

47
''' <summary>48
''' 在编辑模式(FormViewMode=Edit)的控件状态。49
''' </summary>50
< _51
NotifyParentProperty(True), _52
DefaultValue(GetType(EControlStatus), "NotSet") _53
> _54
Public Property EditMode() As EControlStatus55
Get56
Return FEditMode57
End Get58
Set(ByVal value As EControlStatus)59
FEditMode = value60
End Set61
End Property62

63
''' <summary>64
''' 在浏览模式(FormViewMode=ReadOnly)的控件状态。65
''' </summary>66
< _67
NotifyParentProperty(True), _68
DefaultValue(GetType(EControlStatus), "NotSet") _69
> _70
Public Property BrowseMode() As EControlStatus71
Get72
Return FBrowseMode73
End Get74
Set(ByVal value As EControlStatus)75
FBrowseMode = value76
End Set77
End Property78
End Class扩展 TBTextBox 控件
接下来就是改写 TextBox 控件,我们继承 TextBox 类别命名为 TBTextBox,加入一个 FormViewModeStatus 属性( TBFormViewModeStatus 型别),用来设定控件在每种 FormViewMode 的状态,例如设定 FormViewModeStatus.InsertMode 可以设定 FormViewMode.Insert 情形时,控件状态为「不设定、启用、不启用」三择一。主要的作法是覆写 OnPreRender 方法,在此方法中去呼叫 DoFormViewModeStatus 方法,自行判断 TextBox 所属 FormView 的 CurrentMode 来决定本身的状态。
1
Imports System
2
Imports System.ComponentModel
3
Imports System.Drawing
4
Imports System.Web
5
Imports System.Web.UI
6
Imports System.Web.UI.WebControls
7
Imports System.Security.Permissions
8
9
Namespace WebControls
10
< _
11
Description("文字框控件"), _
12
ToolboxData("<{0}:TBTextBox runat=server></{0}:TBTextBox>") _
13
> _
14
Public Class TBTextBox
15
Inherits TextBox
16
Private FFormViewModeStatus As TBFormViewModeStatus
17
18
''' <summary>
19
''' 依 FormViewMode 来设定控件状态。
20
''' </summary>
21
''' <value></value>
22
''' <returns></returns>
23
''' <remarks></remarks>
24
< _
25
Description("依 FormViewMode 来设定控件状态"), _
26
NotifyParentProperty(True), _
27
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
28
PersistenceMode(PersistenceMode.InnerProperty), _
29
DefaultValue("") _
30
> _
31
Public ReadOnly Property FormViewModeStatus() As TBFormViewModeStatus
32
Get
33
If FFormViewModeStatus Is Nothing Then
34
FFormViewModeStatus = New TBFormViewModeStatus
35
End If
36
Return FFormViewModeStatus
37
End Get
38
End Property
39
40
''' <summary>
41
''' 处理控件状态。
42
''' </summary>
43
''' <param name="ControlStatus">控件状态。</param>
44
Private Sub DoControlStatus(ByVal ControlStatus As EControlStatus)
45
Select Case ControlStatus
46
Case EControlStatus.Enable
47
Me.Enabled = True
48
Case EControlStatus.Disable
49
Me.Enabled = False
50
End Select
51
End Sub
52
53
''' <summary>
54
''' 依 FormView 的模式来处理控件状态。
55
''' </summary>
56
Private Sub DoFormViewModeStatus()
57
Dim oFormView As FormView
58
59
'若控件置于 FormView 中,则依 FormView 的模式来处理控件状态
60
If TypeOf Me.BindingContainer Is FormView Then
61
oFormView = DirectCast(Me.BindingContainer, FormView)
62
Select Case oFormView.CurrentMode
63
Case FormViewMode.Insert
64
DoControlStatus(Me.FormViewModeStatus.InsertMode)
65
Case FormViewMode.Edit
66
DoControlStatus(Me.FormViewModeStatus.EditMode)
67
Case FormViewMode.ReadOnly
68
DoControlStatus(Me.FormViewModeStatus.BrowseMode)
69
End Select
70
End If
71
End Sub
72
73
''' <summary>
74
''' 覆写。引发 PreRender 事件。
75
''' </summary>
76
Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
77
MyBase.OnPreRender(e)
78
'依 FormView 的模式来处理控件状态
79
DoFormViewModeStatus()
80
End Sub
81
82
End Class
83
End Namespace
Imports System2
Imports System.ComponentModel3
Imports System.Drawing4
Imports System.Web5
Imports System.Web.UI6
Imports System.Web.UI.WebControls7
Imports System.Security.Permissions8

9
Namespace WebControls10
< _11
Description("文字框控件"), _12
ToolboxData("<{0}:TBTextBox runat=server></{0}:TBTextBox>") _13
> _14
Public Class TBTextBox15
Inherits TextBox16
Private FFormViewModeStatus As TBFormViewModeStatus17

18
''' <summary>19
''' 依 FormViewMode 来设定控件状态。20
''' </summary>21
''' <value></value>22
''' <returns></returns>23
''' <remarks></remarks>24
< _25
Description("依 FormViewMode 来设定控件状态"), _26
NotifyParentProperty(True), _27
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _28
PersistenceMode(PersistenceMode.InnerProperty), _29
DefaultValue("") _30
> _31
Public ReadOnly Property FormViewModeStatus() As TBFormViewModeStatus32
Get33
If FFormViewModeStatus Is Nothing Then34
FFormViewModeStatus = New TBFormViewModeStatus35
End If36
Return FFormViewModeStatus37
End Get38
End Property39

40
''' <summary>41
''' 处理控件状态。42
''' </summary>43
''' <param name="ControlStatus">控件状态。</param>44
Private Sub DoControlStatus(ByVal ControlStatus As EControlStatus)45
Select Case ControlStatus46
Case EControlStatus.Enable47
Me.Enabled = True48
Case EControlStatus.Disable49
Me.Enabled = False50
End Select51
End Sub52

53
''' <summary>54
''' 依 FormView 的模式来处理控件状态。55
''' </summary>56
Private Sub DoFormViewModeStatus()57
Dim oFormView As FormView58

59
'若控件置于 FormView 中,则依 FormView 的模式来处理控件状态60
If TypeOf Me.BindingContainer Is FormView Then61
oFormView = DirectCast(Me.BindingContainer, FormView)62
Select Case oFormView.CurrentMode63
Case FormViewMode.Insert64
DoControlStatus(Me.FormViewModeStatus.InsertMode)65
Case FormViewMode.Edit66
DoControlStatus(Me.FormViewModeStatus.EditMode)67
Case FormViewMode.ReadOnly68
DoControlStatus(Me.FormViewModeStatus.BrowseMode)69
End Select70
End If71
End Sub72

73
''' <summary>74
''' 覆写。引发 PreRender 事件。75
''' </summary>76
Protected Overrides Sub OnPreRender(ByVal e As EventArgs)77
MyBase.OnPreRender(e)78
'依 FormView 的模式来处理控件状态79
DoFormViewModeStatus()80
End Sub81

82
End Class83
End Namespace使用 TBTextBox 控件
将 TBTextBox 放置 FormView 的 EditItemTemplate(Edit 及 Insert 共享 Template,即 InsertItemTemplate=EditItemTemplate)中,在 TBTextBox 的属性窗口中就可以直接设定 FormViewModeStatus 属性即可。如此就可以不用麻烦的判断 FormView 的 CurrentMode,又要 FindControl 来做相关设定,就可以真正达到零程序代码的要求了。
<bee:TBTextBox ID="txtEmployeeID" runat="server" Text='<%# Bind("EmployeeID") %>'>
<FormViewModeStatus InsertMode="Enable" EditMode="Disable" />
</bee:TBTextBox>

浙公网安备 33010602011771号