代码改变世界

[自定义服务器控件] 第二步:下拉列表框。

2008-02-26 20:33  金色海洋(jyk)  阅读(1783)  评论(0编辑  收藏  举报
前面发了一个文本框的,这回发一个下拉列表框。

一般在写自定义控件之前都要考虑一下原来的控件(系统代的)有什么优缺点,有哪些功能是我想要的,但是自带的控件没有提供,或者提供的不是太理想。

那么对于 下拉列表框 我个人感觉有几个地方用着不是太方便。

1、绑定数据库。
当下拉列表框里的数据需要从数据库里提取的时候,就需要设置DataValueFieldDataTextField 的属性,每次用的时候都要设置一下,这个比较烦。
(不好意思,我比较懒)
我的方法是在自定义控件的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 = "101"  '数据类型

实现接口


初始化 OnInit。设置CssClass、DataValueField、DataTextField、


验证类型

验证错误的提示信息


    
'根据传入的ID设置下拉列表框的默认选项,如果没有找到,选第一项,不抛出异常。
    '<param name="listValue">ID值</param>
函数实现  setSelectedByValue

    
' 根据传入的文本内容设置下拉列表框的默认选项,如果没有找到,选第一项,不抛出异常。
    ' <param name="listValue">文本内容</param>
函数实现  SetSelectedByText

    
' 传入查询语句,绑定下拉列表框。正确执行返回空字符串,不正确返回错误信息
    ' <param name="sqlString">查询语句</param>
    ' <returns>正确执行返回空字符串,不正确返回错误信息</returns>
函数实现  bindList


    
' 传入查询语句,绑定下拉列表框。正确执行返回空字符串,不正确返回错误信息
    ' <param name="sqlString">查询语句</param>
    ' <returns>正确执行返回空字符串,不正确返回错误信息</returns>
函数实现  bindList


    
' 添加日期。给下拉列表框填充从 1 到 lastDay 的数据。value 和 text 值一致。
    ' <param name="lastDay">最后一天</param>
    ' <param name="isAddDefaultItem">是否添加 “请选择”</param>
函数实现  ItemAddDate

    
' 添加月份。给下拉列表框填充从 1 到 12 的数据。value 和 text 值一致。
    ' <returns></returns>
函数实现  ItemAddMonth

    
' 用两个字符串来添加选项。
    ' <param name="texts">显示的内容,用的字符串,用“~”分开。</param>
    ' <param name="values">value值,用的字符串,用“~”分开。</param>
函数实现  AddItemByString

    
' 用一个字符串来添加选项。value在前,Text在后
    ' <param name="texts">显示的内容,用的字符串,用“~”分开。</param>
函数实现  AddItemByString

    
' 用两个数组来添加选项。
    ' <param name="texts">显示的内容。</param>
    ' <param name="values">value值。</param>
函数实现  AddItemByArray

    
' 用一个数组来添加选项。values在前,Text在后
    ' <param name="texts">显示的内容,用的字符串,用“~”分开。</param>
    ' <returns></returns>
函数实现  AddItemByArray

    
' 用一个二维数组来添加选项。values在前,Text在后
    ' <param name="texts">显示的内容,用的字符串,用“~”分开。</param>
函数实现  AddItemByArrayTwo

设置设计时的显示页面

End Class


2