摘要
延续前面「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 来做相关设定,就可以真正达到零程序代码的要求了。
延续前面「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
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
扩展 TBTextBox 控件
接下来就是改写 TextBox 控件,我们继承 TextBox 类别命名为 TBTextBox,加入一个 FormViewModeStatus 属性( TBFormViewModeStatus 型别),用来设定控件在每种 FormViewMode 的状态,例如设定 FormViewModeStatus.InsertMode 可以设定 FormViewMode.Insert 情形时,控件状态为「不设定、启用、不启用」三择一。主要的作法是覆写 OnPreRender 方法,在此方法中去呼叫 DoFormViewModeStatus 方法,自行判断 TextBox 所属 FormView 的 CurrentMode 来决定本身的状态。
1Imports System
2Imports System.ComponentModel
3Imports System.Drawing
4Imports System.Web
5Imports System.Web.UI
6Imports System.Web.UI.WebControls
7Imports System.Security.Permissions
8
9Namespace 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
83End Namespace
2Imports System.ComponentModel
3Imports System.Drawing
4Imports System.Web
5Imports System.Web.UI
6Imports System.Web.UI.WebControls
7Imports System.Security.Permissions
8
9Namespace 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
83End 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>
<FormViewModeStatus InsertMode="Enable" EditMode="Disable" />
</bee:TBTextBox>