扩展CheckBoxList实现选中绑定

CheckBoxList中有DataTextField和DataValueField可以用于设置绑定时的绑定对象属性,但是可惜针对CheckBoxList却没有办法直接绑定一个Item是否被选中。于是我打算扩展一下CheckBoxList,使得该控件可以绑定Checked状态。具体做法是这样的:

(1)新建一个Web服务器控件项目,添加Web服务器控件类CheckBoxListWithCheckBind。

(2)将该类继承自CheckBoxList。

public class CheckBoxListWithCheckBind : CheckBoxList

(3)增加属性DataCheckedField,用于指定绑定Checked状态的属性名字符串。

[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]public string DataCheckedField
{
get
{
String s = (String)ViewState["DataCheckedField"];return ((s == null) ? String.Empty : s);
}
set
{
ViewState["DataCheckedField"] = value;
}
}

(4)增加BindChecked方法,用于绑定CheckBoxList中的每个Item的Selected属性,这里使用Items.FindByValue方法来找Item的,这里认为每个Item的Value是不同的。如果是Item的Text是不同的,那么也可以使用Items.FindByText方法。

 private void BindChecked()
{
var dataSource = this.DataSource as IEnumerable;if(dataSource==null)
{return;
}foreach (object obj2 in dataSource)
{
var value = DataBinder.GetPropertyValue(obj2, DataValueField, null);
ListItem item = this.Items.FindByValue(value);if (DataCheckedField.Length > 0)
{
item.Selected = Convert.ToBoolean(DataBinder.GetPropertyValue(obj2, DataCheckedField, null));
}
}
}

(5)重写OnDataBinding方法,在基类的OnDataBinding方法后调用前面写的BindChecked方法。

protected override void OnDataBinding(EventArgs e)
{base.OnDataBinding(e);
BindChecked();
}

具体的代码如下:


public class CheckBoxListWithCheckBind : CheckBoxList
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string DataCheckedField
        {
            get
            {
                String s = (String)ViewState["DataCheckedField"];
                return ((s == null) ? String.Empty : s);
            }
            set
            {
                ViewState["DataCheckedField"] = value;
            }
        }
        protected override void OnDataBinding(EventArgs e)
        {
            base.OnDataBinding(e);
            BindChecked();
        }

        private void BindChecked()
        {
            var dataSource = this.DataSource as IEnumerable;
            if(dataSource==null)
            {
                return;
            }
            foreach (object obj2 in dataSource)
            {
                var value = DataBinder.GetPropertyValue(obj2, DataValueField, null);
                ListItem item = this.Items.FindByValue(value);
                if (DataCheckedField.Length > 0)
                {
                    item.Selected = Convert.ToBoolean(DataBinder.GetPropertyValue(obj2, DataCheckedField, null));
                }
            }
        }
    }

接下来的使用方法就很简单了,直接在aspx页面上写该控件的DataCheckedField属性既可:

<cc1:CheckBoxListWithCheckBind ID="cbxl" runat="server" DataTextField="CompanyName" DataValueField="CompanyCode" DataCheckedField="IsChecked">
</cc1:CheckBoxListWithCheckBind> 
时间: 2024-09-30 09:58:45

扩展CheckBoxList实现选中绑定的相关文章

ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)_jquery

界面代码: 复制代码 代码如下: <form id="form1" runat="server"> <div align="left"> <fieldset style="width: 400px; height: 150px"> <p> 请选择语言</p> <asp:CheckBoxList ID="ckbListPro" runat=&q

jqueryEasyUI:tabs扩展:给tabs组件绑定双击事件

实现代码: $.extend($.fn.tabs.methods, {     /**      * 绑定双击事件      * @param {Object} jq      * @param {Object} caller 绑定的事件处理程序      */     bindDblclick: function(jq, caller){         return jq.each(function(){             var that = this;             $(

asp.net 获取repeater中checkBoxlist选中的值

问题描述 checkboxlist是用SqlDataSource绑定的,程序需完成的效果如图:repeater与checkboxlist分开绑定的.在进行选择完成后,提交获取每个checkboxlist中选中的值:checkboxlist长度可能改变.for(inti=0;i<rep_dlist.Items.Count;i++){intdID=Convert.ToInt32(((Label)this.rep_dlist.Items[i].FindControl("lbl_UDepartID

根据选中的Checkbox,点击查询,Gridview显示出不同的列

问题描述 但是遇到如下情况,该怎么解决?页面上放了一个CheckboxList,里面有若干个checkbox,当我选中其中几个CheckBox,点击查询按钮的时候,Gridview就显示我选中的那几列,比如,我选中了3个Checkbox,Gridview就显示出3列,一个都不选,则Gridview显示全部,这样该如何解决呢??? 解决方案 解决方案二:其实思路很简单,每次查询都是查询所有列,然后绑定,隐藏所有列.只不过多一步的操作是,获取到checkboxlist里面选中的item,写个for循

100分求2个checkboxlist联动的ajax实现?

问题描述 如何用ajax实现2个checkboxlist的联动:选中其中一个checkboxlist的任意一个item,另外一个checkboxlist根据选中的item的value重新绑定一个datatable.给出思路即可.最好有示例. 解决方案 解决方案二:在SelectedIndexChanged事件里抓取当前被选中的项根据选中项的值重新获得一个datatable解决方案三:引用1楼fengjian_428的回复: 在SelectedIndexChanged事件里抓取当前被选中的项 根据

XUL教程:对XBL元素进行扩展

本文配套源码 原文标题:XUL Tutorial - Bindings - XBL Inheritance 原文作者:Neil Deakin 原文地址:http://www.xulplanet.com/tutorials/xultu/xblinherit.html 下面是对原文的翻译: 在这一小节,我们将学习如果对已有的XBL定义进行扩展. 继承(Inheritance) 有时你要建立的组件可能和现有的某个组件很相似,比如你想建立一个可以弹出菜单的按钮,一种方法是重复造车轮,复制现有的butto

绑定Enum到ASP.NET数据绑定控件的完美解决方案

本文向读者介绍NBear中实现的DropDownListField字段绑定控件和EnumDescriptionAttribute特性.结合使用这两个组件,就可以最简单.易用和可扩展地完美解决绑定Enum到ASP.NET数据绑定控件的问题.[05/26修订]--增加支持第三方枚举描述,支持二进制与过的枚举值. 从DropDownListField的名称,大家一定猜到了,是的,DropDownListField控件和ASP.NET内置的BoundField,CheckBoxField等一样,可以直接

C# 参数带this是什么意思(扩展方法)

扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Collections.IEnumerable 和 System.Collections.Generic.

通过“四大行为”对WCF的扩展[原理篇]

整个WCF框架由两个基本的层次构成,即服务模型层和信道层.对信道层的扩展主要通过针对绑定的扩展实现,具体来说就是自定义绑定元素,以及相关的信道管理器(信道监听器和信道工厂).信道来改变对消息的处理和传输方式. 而对于服务模式型层的扩展则主要体现服务端和客户端运行时框架的定制,进而让WCF按照我们希望的方式进行运作.由于整个运行时框架由一系列的可扩展组件构成,并且大部分运行时属性也可以改写,所以针对服务模型层的扩展具体体现在:根据具体的需要定义相应的组件,并以某种情形将这些自定义的组件应用到运行时