摘要
延续前面「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 EControlStatusEnum 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 TBFormViewModeStatusClass 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()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()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()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 WebControlsNamespace WebControls
10    < _
11    Description("文字框控件"), _
12    ToolboxData("<{0}:TBTextBox runat=server></{0}:TBTextBox>") _
13    > _
14    Public Class TBTextBoxClass 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()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()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()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()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>

扩展 TextBox 控件 - 依 FormViewMode 来自行设定状态相关推荐

  1. 扩展GridView控件(2) - 复合排序和排序状态提示

    GridView既强大又好用.为了让它更强大.更好用,我们来写一个继承自GridView的控件. [索引页] [源码下载] 扩展GridView控件(2) - 复合排序和排序状态提示 作者:webab ...

  2. VB.NET学习笔记:自定义控件之扩展TEXTBOX控件——水印文字提示效果

    测试环境:windows 7和Microsoft Visual Studio 2017 看到一些优秀软件里的TEXTBOX文本框都有水印文字提示应该输入什么样的信息,获取光标后提示文字消失,光标离开后 ...

  3. DotNetTextBox V2.0 Web Control(ASP.NET2.0 增强型TextBox控件,完全支持AJAX.NET)

    [控件界面] [控件介绍] 名称:DotNetTextBox V2.0 Web Control 免费无限制版 类型:ASP.NET2.0 增强型TextBox控件 作者: 小宝.NET2.0 主页:h ...

  4. ASP.NET 3.5核心编程学习笔记(55):自定义扩展程序控件的创建

    ASP.NET并没有包含对扩展程序的具体实现.然而,它定义了供所有自定义扩展程序和ACT中所有扩展程序使用的基类ExtenderControl.我们可通过该类创建自己的扩展程序.但并不建议这样做,因为 ...

  5. 自定义view学习-手把手教你制作一个可扩展日历控件

    来看看效果图先,手把手教你实现一个简易,但高扩展度的日历控件,可自由扩展成签到,单选,多选日期. 首先我们来分析实现思路.对于上图的效果,很明显是一个6x7的表格. 我们可以两个for循环控制绘制每个 ...

  6. 扩展GridView控件(7) - 行的指定复选框选中时改变行的样式

    GridView既强大又好用.为了让它更强大.更好用,我们来写一个继承自GridView的控件. [索引页] [×××] 扩展GridView控件(7) - 行的指定复选框选中时改变行的样式 作者:w ...

  7. ASP.Net TextBox控件只允许输入数字

    原文:ASP.Net TextBox控件只允许输入数字 1.1.在Asp.Net TextBox 控件的 OnKeyPress 事件中指定输入键盘码必须为数字: <asp:TextBox ID= ...

  8. 关于TextBox控件字体颜色绑定

    1.通过WPF绑定一个属性,比如bool型的数据 <TextBox BorderBrush="Transparent" Text="{Binding Path=Da ...

  9. 扩展GridView控件——为内容项添加拖放及分组功能

    引言 相信大家对GridView都不陌生,是非常有用的控件,用于平铺有序的显示多个内容项.打开任何WinRT应用或者是微软合作商的网站,都会在APP中发现GridView的使用."Tiles ...

最新文章

  1. python出现套接字创建不成功_python套接字连接在Mac上被拒绝但在Windows
  2. 如何使用Sublime Text 2重新格式化HTML代码?
  3. Springboot中使用Google 的Kaptcha工具实现验证码校验
  4. android 应用自动重启,Android 应用崩溃后自动重启的方法
  5. python基础-基础知识(包括:函数递归等知识)
  6. Bash中单引号和双引号之间的区别
  7. 稀疏矩阵-sparse 存储和转换
  8. 2019年美赛建模总结与e题思路
  9. natapp软件使用
  10. A1339. JZPLCM(顾昱洲)|树状数组|hash表|逆元|分解质因数
  11. 监控实时直播的四分屏的前端展示
  12. Five-degree-of-freedom manipulation of an untethered magnetic device in fluid using a single permane
  13. 处方常用拉丁词缩写与中文对照表
  14. c语言用质因数分解法求最大公约数,《分解质因数的方法求最大公约数》数学教案...
  15. 微服务项目部署服务器,第3章 3.2 部署服务器 - 编排多个微服务
  16. 如何建立维基百科页面(Wikipedia)
  17. 【网络流24题】太空飞行计划问题
  18. 渝首家跨国“威客”登陆美国
  19. python爬取音乐并保存_python爬取QQ音乐歌单歌曲保存到本地,json解析
  20. spring-cloud微服务架构图

热门文章

  1. 弹出框之对话框和提示框,可共用代码
  2. 转 13种最为荒谬的编程语言(Bugku 加密)
  3. Web SCADA 电力接线图工控组态编辑器 1
  4. 记一个有趣的Java OOM!
  5. 一些在线检测网站打开速度工具大分享
  6. Eclipse批量替换
  7. Loadrunner脚本编程(4)-数据类型操作和字符串操作
  8. jQuery选择器遇上一些特殊字符
  9. MySQL要不要用函数_2.mysql函数的使用
  10. github上成员贡献量_Bifrost 长期贡献规则,获得 BNC 的 5 种方式