摘要
延续前面「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. springboot-26-springboot 集成rabbitmq
  2. android—label窗口——基础编
  3. 【 C 】回调函数简记
  4. oracle数据类型查询,Oracle 空间查询, 数据类型为 sdo_geometry
  5. 面对offer,如何选择
  6. React开发(126):ant design学习指南之form中的自定义校验labelCol
  7. Juventas, the Roman Goddess of Youth [ Juventas, 罗马青春女神]
  8. 全球首例!机器人生娃
  9. 数论 —— 整数分解
  10. go语言打包html,Go语言-打包静态文件
  11. PHP实现常用的数据结构之链表
  12. 计算机软件销售收入会计,嵌入式软件产品销售额如何计算
  13. java poi 合并单元格
  14. 进程的守护神 - daemontools(进程监控)
  15. webpack打包报错系列(二)Failed to load C:\Users\XXX\webpack.config.js:17 mode: ‘development‘
  16. 计算机c盘能格式化吗,c盘可以直接格式化吗?C盘怎么格式化?
  17. 音乐迷(无损音乐下载器)
  18. linux rm rf 无法删除文件夹,linux下的文件用root用户rm -rf命令无法删除解决方案
  19. linux博通bcm4313无线网卡,在Deepin 15.7系统中解决BCM4313无线网卡网速慢的问题
  20. TypeScript实战-05-TS接口之对象类型接口

热门文章

  1. 完美安装ubuntu
  2. web渗透测试思路浅谈-----漏洞发现及利用
  3. Session何时创建实例
  4. Kubernetes!我要用这样的姿势拥抱你|坐标深圳
  5. 关于《ASP.NET MVC企业级实战》
  6. MySQL当查询的时候有多个结果,但需要返回一条的情况用GROUP_CONCAT拼接
  7. 被迫开源的都是快要死的
  8. 轻松搞定ServerCore初始设置
  9. 421. 数组中两个数的最大异或值
  10. 1014. 最佳观光组合