摘要
延续前面「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

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

扩展 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

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

使用 TBTextBox 控件
将 TBTextBox 放置 FormView 的 EditItemTemplate(Edit 及 Insert 共享 Template,即 InsertItemTemplate=EditItemTemplate)中,在 TBTextBox 的属性窗口中就可以直接设定 FormViewModeStatus 属性即可。如此就可以不用麻烦的判断 FormView 的 CurrentMode,又要 FindControl 来做相关设定,就可以真正达到零程序代码的要求了。



