[自定义服务器控件] 第二步:下拉列表框。
前面发了一个文本框的,这回发一个下拉列表框。
一般在写自定义控件之前都要考虑一下原来的控件(系统代的)有什么优缺点,有哪些功能是我想要的,但是自带的控件没有提供,或者提供的不是太理想。
那么对于 下拉列表框 我个人感觉有几个地方用着不是太方便。
1、绑定数据库。
当下拉列表框里的数据需要从数据库里提取的时候,就需要设置DataValueField 和 DataTextField 的属性,每次用的时候都要设置一下,这个比较烦。
(不好意思,我比较懒)
我的方法是在自定义控件的OnInit 时间里面加上
Me.CssClass = "lst"
Me.DataValueField = "ID"
Me.DataTextField = "txt"
Me.Font.Size = FontUnit.Point(9)
这就方便多了,只是在写SQL语句的时候需要使用别名的方式,修改字段的名称,以便适应 ID和txt。
如果您不喜欢这种方式的话,可以略过。:)
2、设置选定的选项。
在修改数据的时候,往往需要根据已经保存的数据来设置下拉列表框的第几个选项是被选中的,以便于修改。(不知道我有没有说清楚,表达能力还有待提高。)
当然系统的下拉列表框提供了这个功能,
Me.Items.FindByText("125").Selected = True
Me.SelectedValue = "125";
其他方法略。
可以用这种几方法来设置,但是这里有一个共同小问题,就是当下拉列表框的item里面没有“125” 的时候会抛出异常。
对于框架来说这么做没有什么问题,但是对于客户就不好了。
当然这个是可以避免的,一是检查是否出现异常,要不就是确保数据是完整的,绝对不会出现这种在item里面找不到值的情况。
但是我比较懒,不像写太多的代码来预防这些事情。
我写了一个 SetSelectedByValue (ByVal listValue As String) 的方法来设置,这样就方便多了。
3、添加月份、日期等信息。
如果需要写一个下拉列表框,这个框里面要放置12个月份,还要写个循环或者在.aspx里面设置。我设了一个偷懒的方法。
4、其他的常用的填充方法。
您可以把您常用的填充的数据放在自定义控件里面,调用的时候就会方便很多。
5、验证。
这个和 文本框是一样的,也是使用正则的方式来验证。这里主要验证是否选择了一个选项。
比如:第一个item是“请选择”,而这个下拉列表框又必须有一个选项(当然不能选第一个了),这个时候就需要验证一下。
6、实现接口
和文本框一样实现了下面的几个接口
属性(接口):
ControlKind 返回控件的类型。
函数(接口):
GetValue() 获取文本框的值,默认返回 TextTrim
GetValue(ByVal kind As String) 根据 kind 获取对应的文本框的值。
SetValue(ByVal value As String) 给文本框赋值
SetValue(ByVal value As String, ByVal kind As String)给文本框赋值
好像有点乱,感兴趣的话看看下面的代码吧。
<DefaultProperty("Text"), ToolboxData("<{0}:HBSDropDownList runat=server></{0}:HBSDropDownList>")> _
Public Class HBSDropDownList
Inherits System.Web.UI.WebControls.DropDownList
Implements IGetControlValue
Dim _dataType As String = "" '数据类型
#Region "实现接口"
<Bindable(True), Category("默认值"), DefaultValue(""), Description("获取控件类别")> _
ReadOnly Property ControlKind() As String Implements IGetControlValue.ControlKind
Get
Return ""
End Get
End Property
Public Function GetValue() As String Implements IGetControlValue.GetControlValue
Return Me.SelectedValue
End Function
Public Function GetValue(ByVal kind As String) As String Implements IGetControlValue.GetControlValue
Return ""
End Function
Public Sub SetValue(ByVal value As String) Implements IGetControlValue.SetControlValue
Me.SetSelectedByValue(value)
End Sub
Public Sub SetValue(ByVal value As String, ByVal kind As String) Implements IGetControlValue.SetControlValue
End Sub
#End Region
#Region "初始化 OnInit。设置CssClass、DataValueField、DataTextField、"
Protected Overrides Sub OnInit(ByVal e As EventArgs)
Me.CssClass = "lst"
Me.DataValueField = "ID"
Me.DataTextField = "txt"
Me.Font.Size = FontUnit.Point()
'Me.Style.Add("ime-mode", "disabled;")
Me.Items.FindByValue("").Selected = True
End Sub
#End Region
#Region "验证类型"
<Category("数据验证"), Description("验证输入的内容,需要js脚本配合。"), DefaultValue("")> _
Property CheckDataType() As String
Set(ByVal Value As String)
_dataType = Value
'101 b不验证
'102 z自然数
'103 z整数
'104 x小数
'105 r日期
'106 b必填
Select Case Value
Case "" '不验证
'this.Attributes.Add("DataType","");
Case "" '必填项 == 必须选择
Me.Attributes.Add("check", "[1-9]{1}[0-9]*")
End Select
End Set
Get
If _dataType Is Nothing Then
Return ""
End If
Return _dataType
End Get
End Property
<Category("数据验证"), Description("验证输入的内容,传入正则表达式。"), DefaultValue("")> _
Property CheckDataReg() As String
Set(ByVal Value As String)
Me.Attributes.Add("check", Value)
End Set
Get
If Me.Attributes.Item("check") Is Nothing Then
Return ""
End If
Return Me.Attributes.Item("check").ToString()
End Get
End Property
#End Region
#Region "验证错误的提示信息"
<Description("验证错误提示信息")> _
Property CheckErrorMessage() As String
'添加提示信息
Set(ByVal Value As String)
ViewState("msg") = Value
Me.Attributes.Add("warning", Value)
End Set
Get
If (ViewState("msg") Is Nothing) Then
Return ""
Else
Return ViewState("msg").ToString()
End If
End Get
End Property
#End Region
'根据传入的ID设置下拉列表框的默认选项,如果没有找到,选第一项,不抛出异常。
'<param name="listValue">ID值</param>
#Region "函数实现 setSelectedByValue"
Public Sub SetSelectedByValue(ByVal listValue As String)
Me.SelectedIndex = -
If (listValue = "True") Then
listValue = ""
End If
If (listValue = "False") Then
listValue = ""
End If
Dim item As ListItem
Dim i As Int32 =
For Each item In Me.Items
If (item.Value.Equals(listValue)) Then
' item.Selected = True
Me.SelectedIndex = i
Return
End If
i = i +
Next
'Me.SelectedIndex = 0
End Sub
#End Region
' 根据传入的文本内容设置下拉列表框的默认选项,如果没有找到,选第一项,不抛出异常。
' <param name="listValue">文本内容</param>
#Region "函数实现 SetSelectedByText"
Public Sub SetSelectedByText(ByVal listText As String)
Me.SelectedIndex = -
Dim item As ListItem
For Each item In Me.Items
If item.Text.Equals(listText) Then
item.Selected = True
Return
End If
Next
'Me.SelectedIndex = 0
End Sub
#End Region
' 传入查询语句,绑定下拉列表框。正确执行返回空字符串,不正确返回错误信息
' <param name="sqlString">查询语句</param>
' <returns>正确执行返回空字符串,不正确返回错误信息</returns>
#Region "函数实现 bindList"
Public Function BindListBySQL(ByVal sqlString As String, ByVal isAddItem As Boolean) As String
Dim dal = New DataAccessLayer
'Me.DataSource = PublicClass.GetDataTableBySQL(sqlString)
Me.DataSource = dal.RunSqlDataTable(sqlString)
Me.DataBind()
If isAddItem Then
'Me.Items.Insert(0, New ListItem("请选择", "-2"))
End If
Return ""
End Function
#End Region
' 传入查询语句,绑定下拉列表框。正确执行返回空字符串,不正确返回错误信息
' <param name="sqlString">查询语句</param>
' <returns>正确执行返回空字符串,不正确返回错误信息</returns>
#Region "函数实现 bindList"
Public Function BindListByStore(ByVal store As String) As String
Dim dal As New DataAccessLayer
Me.DataSource = dal.RunStoreDataTable(store)
Me.DataBind()
Dim Err As String = dal.ErrorMsg
dal.Dispose()
If (Err.Length < ) Then
Return ""
Else
Return Err
End If
End Function
#End Region
' 添加日期。给下拉列表框填充从 1 到 lastDay 的数据。value 和 text 值一致。
' <param name="lastDay">最后一天</param>
' <param name="isAddDefaultItem">是否添加 “请选择”</param>
#Region "函数实现 ItemAddDate"
Public Sub ItemAddDate(ByVal lastDay As Int32)
Dim i As Int32
For i = To lastDay
Me.Items.Add(New ListItem(i.ToString(), i.ToString()))
Next
End Sub
#End Region
' 添加月份。给下拉列表框填充从 1 到 12 的数据。value 和 text 值一致。
' <returns></returns>
#Region "函数实现 ItemAddMonth"
Public Sub ItemAddMonth()
Dim i As Int32
For i = To
Me.Items.Add(New ListItem(i.ToString(), i.ToString()))
Next
End Sub
#End Region
' 用两个字符串来添加选项。
' <param name="texts">显示的内容,用的字符串,用“~”分开。</param>
' <param name="values">value值,用的字符串,用“~”分开。</param>
#Region "函数实现 AddItemByString"
Public Sub AddItemByString(ByVal values As String, ByVal texts As String)
Dim strText As String() = texts.Split("~")
Dim strValue As String() = values.Split("~")
Dim i As Int32
For i = To strText.Length
Me.Items.Add(New ListItem(strText(i), strValue(i)))
Next
End Sub
#End Region
' 用一个字符串来添加选项。value在前,Text在后
' <param name="texts">显示的内容,用的字符串,用“~”分开。</param>
#Region "函数实现 AddItemByString"
Public Sub AddItemByString(ByVal TextsAndValues As String)
Dim str As String() = TextsAndValues.Split("~")
Dim Len As Int32 = str.Length
Dim i As Int32
For i = To Len -
Me.Items.Add(New ListItem(str(Len + i), str(i)))
Next
End Sub
#End Region
' 用两个数组来添加选项。
' <param name="texts">显示的内容。</param>
' <param name="values">value值。</param>
#Region "函数实现 AddItemByArray"
Public Sub AddItemByArray(ByVal values As String(), ByVal texts As String())
Dim i As Int32
For i = To texts.Length
Me.Items.Add(New ListItem(texts(i), values(i)))
Next
End Sub
#End Region
' 用一个数组来添加选项。values在前,Text在后
' <param name="texts">显示的内容,用的字符串,用“~”分开。</param>
' <returns></returns>
#Region "函数实现 AddItemByArray"
Public Sub AddItemByArray(ByVal ValuesAndTexts As String())
Dim len As Int32 = ValuesAndTexts.Length /
Dim i As Int32
For i = To len
Me.Items.Add(New ListItem(ValuesAndTexts(len + i), ValuesAndTexts(i)))
Next
End Sub
#End Region
' 用一个二维数组来添加选项。values在前,Text在后
' <param name="texts">显示的内容,用的字符串,用“~”分开。</param>
#Region "函数实现 AddItemByArrayTwo"
Public Sub AddItemByArrayTwo(ByVal ValuesAndTexts As String(,))
Dim len As Int32 = ValuesAndTexts.Length / -
Dim i As Int32
For i = To len
Me.Items.Add(New ListItem(ValuesAndTexts(i, ), ValuesAndTexts(i, )))
Next
End Sub
#End Region
#Region " 设置设计时的显示页面"
' 将此控件呈现给指定的输出参数。
' <param name="output"> 要写出到的 HTML 编写器 </param>
Protected Overrides Sub Render(ByVal output As HtmlTextWriter)
If ((Not MyBase.Site Is Nothing) AndAlso MyBase.Site.DesignMode) Then
MyBase.Render(output)
Else
output.Write("<span class=""lst"">")
MyBase.Render(output)
output.Write("</span>")
End If
End Sub
#End Region
End Class
- tensorflow(一)windows 10 python3.6安装tensorflow1.4与基本概念解读
- 基于AgileEAS.NET SOA 中间件领域模型数据器快速打造自己的代码生成器
- Java基础-day07-代码题-自定义数据类型;ArrayList集合
- 一条报警信息的快速处理和分析(r9笔记第99天)
- 【Go 语言社区】解析Go语言编程中的struct结构
- centos+scala2.11.4+hadoop2.3+spark1.3.1环境搭建
- 【Go 语言社区】Golang 语言获取本机逻辑CPU数量的方法
- Data Guard搭建困境突围(一)(r10笔记第17天)
- Java基础-day07-知识点相关题-自定义数据类型;ArrayList
- windows10 tensorflow(二)原理实战之回归分析,深度学习框架(梯度下降法求解回归参数)
- 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
- 最近的几个技术问题总结和答疑(九)(r10笔记第16天)
- AgileEAS.NET SOA中间件平台更新日志 2015-04-28
- 【Go 语言社区】Golang语言操作redis连接池的方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 简单谈谈我的Android屏幕适配之路
- Js中Symbol对象
- 责任链模式
- Android Studio升级到3.0后遇到的坑
- Android原生项目集成React Native的方法
- Android编程之光线传感器用法详解
- Android Studio 3.0 新功能全面解析和旧项目适配问题
- Android开发中使用外部应用获取SD卡状态的方法
- Android编程使用光线传感器获取光线强弱的方法【LightSensorManager封装类】
- Android开发中的重力传感器用法实例详解
- 腾讯云TKE-Ingress案例: Nginx-Ingress 实现grpc转发
- 机器人软件中间层 yarp-Yet Another Robot Platforms
- 3分钟短文:Laravel写个命令行,你就是下一个Geek!
- Android开发多年每天Crud不清楚自己的技术?来刷刷大厂的高端技术面试题就知道了
- MySQL案例:count(*)效率优化