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


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

使用 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>


posted on 2008-05-14 22:58  jeff377  阅读(1851)  评论(1编辑  收藏  举报