posts - 69, comments - 297, trackbacks - 21, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

扩展 CheckBoxList 控件 - 系结复选项目

Posted on 2008-05-26 08:10 jeff377 阅读(1514) 评论(5)  编辑 收藏 所属分类: Server Control
摘要
CheckBoxList 控件是使用在项目复选的状态,我们可以使用一个整数值来描述复选项目,项目值以 2 的 N 次方来描述。例如
选项一 = 2^0 = 1
选项二 = 2^1 = 2
选项三 = 2^2 = 4
选项四 = 2^3 = 8
... 依此类推
当复选了「选项一」及「选项三」,则复选值为 1+4=5。当复选了「选项二」及「选项四」,则复选值为 2+8=10。若要使用上述的方式来描述复选项目,一般要自行撰写程序代码来处理。本文将扩展 CheckBoxList 控件,新增一个 FlagValue 属性,直接可以双向系结这个复选值。

扩展 CheckBoxList 控件
继承 CheckBoxList 命名为 TBCheckBoxList,新增一个 FlagValue 属性。当取得 FlagValue 值时,会使用 GetFlagValue 方法取的复选的项目对应的值,当设定 FlagValue 值时,会使用 SetFlagValue 方法将值反应至复选项目。

 1Imports System.Web.UI.WebControls
 2Imports System.ComponentModel
 3
 4Namespace WebControls
 5    Public Class TBCheckBoxList
 6        Inherits CheckBoxList
 7
 8        ''' <summary>
 9        ''' 项目复选的 Flag 值。
10        ''' </summary>

11        <Bindable(True)> _
12        Public Property FlagValue() As Integer
13            Get
14                Return GetFlagValue()
15            End Get
16            Set(ByVal value As Integer)
17                SetFlagValue(value)
18            End Set
19        End Property

20
21        ''' <summary>
22        ''' 取得 Flag 值。
23        ''' </summary>

24        Private Function GetFlagValue() As Integer
25            Dim iFlagValue As Integer
26            Dim iValue As Integer
27            Dim oItem As ListItem
28            Dim N1 As Integer
29
30            iFlagValue = 0
31            For N1 = 0 To Me.Items.Count - 1
32                oItem = Me.Items(N1)
33                If oItem.Selected Then
34                    iValue = CInt(2 ^ N1) '2 的 N 次方
35                    iFlagValue = iFlagValue + iValue
36                End If
37            Next
38            Return iFlagValue
39        End Function

40
41        ''' <summary>
42        ''' 设定 Flag 值。
43        ''' </summary>
44        ''' <param name="Value">Flag 值。</param>

45        Private Sub SetFlagValue(ByVal Value As Integer)
46            Dim iFlagValue As Integer
47            Dim iBase As Integer
48            Dim iValue As Integer
49
50            Me.ClearSelection()
51            iFlagValue = Value
52            iBase = 0
53            While iBase <= iFlagValue
54                iValue = CInt(2 ^ iBase) '2 的 N 次方
55                If (iFlagValue And iValue) = iValue Then
56                    Me.Items(iBase).Selected = True
57                    iFlagValue = iFlagValue - iValue
58                End If
59                iBase = iBase + 1
60            End While
61        End Sub

62
63    End Class

64End Namespace

测试程序
在页面上放置 TBCheckBoxList 控件,我们只要使用 FlagValue 属性值,就可以轻易的取得或设定复选值。



1    Protected Sub btnGetFlagValue_Click(ByVal sender As ObjectByVal e As System.EventArgs) Handles btnGetFlagValue.Click
2        txtValue.Text = CheckBoxList1.FlagValue.ToString
3    End Sub

4
5    Protected Sub btnSetFlagValue_Click(ByVal sender As ObjectByVal e As System.EventArgs) Handles btnSetFlagValue.Click
6        CheckBoxList1.FlagValue = CInt(txtValue.Text)
7    End Sub

如果 TBCheckBoxList.FlagValue 需要系结字段时,只需直接设定即可




Feedback

#1楼    回复  引用  查看    

2008-05-26 08:26 by 金色海洋(jyk)      
CheckBoxList 每一个item都有一个value呀,用这个不是更方便吗?

http://www.cnblogs.com/jyk/archive/2008/02/26/1082805.html

我是这么处理的。

#2楼 [楼主]   回复  引用  查看    

2008-05-26 13:00 by jeff377      
@金色海洋(jyk)
使用整數值來表達複選是有使用時機的,例如權限設定「瀏覽=1 新增=2 修改=4 刪除=5」,當使用者判斷該表單是否有修改權時,只需要判斷 (權限值 And 4)=4 就代表有修改權。

#3楼    回复  引用    

2008-05-26 22:51 by C#爱好者 [未注册用户]
item都有value,用这个不是更方便吗?

#4楼 [楼主]   回复  引用  查看    

2008-05-26 23:17 by jeff377      
@C#爱好者
看你的需求選擇合適的就行了。

#5楼    回复  引用  查看    

2008-05-26 23:18 by 蜀山雪狼      
博主的方法,我在03用过,不错的说。支持一下。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: