如何根据集合动态构建复选框选择控件

背景:根据列表或集合,构建复选框控件,从中选取若干选项。比如,构建城市选择控件,城市按照字母分组进行展示。再比如,构建学生选择控件,学生按照城市进行分组展示。常作为分部视图使用。

效果图:

如图,城市以红色字体显示,李雷来自北京,同时Lily和Lucy来自纽约。

HTML代码如下:

 1         <table><tr><td><input type="checkbox" id="checkedAll" onclick="whenAllChecked($(this))" /><label>全选</label></td></tr></table>
 2         <table id="tableStu">
 3            @{
 4                var tmp = ViewBag.CityList as List<STU>;
 5                 foreach (var item in tmp.GroupBy(c=>c.City).OrderBy(b=>b.Key))
 6                 {
 7                     <tr><td><input type="checkbox" class="city" onclick="whenCityChecked($(this))" [email protected] /><label for[email protected] style="color:red">@item.Key</label></td></tr>
 8                     <tr>
 9                         @foreach(STU s in item.OrderBy(a=>a.Age))
10                         {
11                             <td><input type="checkbox" [email protected] class="stuCheck" onclick="whenStuChecked($(this))"/><label for[email protected]>@s.Name</label></td>
12                         }
13                     </tr>
14                 }
15             }
16         </table>

JS代码如下:

 1 <script>
 2     function whenStuChecked($obj) {
 3         var cityChecked = true;
 4         var AllChecked = true;
 5         $obj.parent().parent().find(‘input‘).each(function () {
 6             if ($(this).attr(‘Checked‘) != "checked") {
 7                 $obj.parent().parent().prev(‘tr‘).find(‘input‘).removeAttr(‘checked‘);
 8                 cityChecked = false;
 9                 AllChecked = false;
10             }
11         });
12         if (AllChecked == false) {
13             $("#checkedAll").removeAttr("checked");
14         }
15         if (cityChecked) {
16             $obj.parent().parent().prev(‘tr‘).find(‘input‘).attr("checked", "checked");
17             $obj.parent().parent().parent().find(".city").each(function () {
18                 if ($("#checkedAll").attr("checked") != "checked") {
19                     AllChecked = false;
20                 }
21             });
22             if (AllChecked == true) {
23                 $("#checkedAll").attr("checked", "checked");
24
25             }
26             //if (AllChecked == false) {
27             //    $("#checkedAll").removeAttr("checked");
28             //}
29         }
30     }
31     function whenAllChecked($obj) {
32         //alert($("#checkedAll").attr("checked"));
33         if ($("#checkedAll").attr("checked") == "checked") {
34             //$("#tableStu").find("input").removeAttr("checked");
35             $("#tableStu").find("input").each(function () {
36                 $(this).attr("checked", "checked");
37             });
38         }
39         else {
40             $("#tableStu").find("input").each(function () {
41                 $(this).removeAttr("checked")
42             });
43
44             //$("#tableStu").find("input").attr("checked", "checked");
45         }
46     }
47     function whenCityChecked($obj) {
48         //alert($obj.attr("checked"));
49         if ($obj.attr("checked") == "checked") {
50             $obj.parent().parent().next(‘tr‘).find(‘input‘).each(function () {
51                 $(this).attr("checked", "checked");
52             });
53             var allcheck = true;
54             $("#tableStu").find(‘.city‘).each(function () {
55                 if ($(this).attr("checked") != "checked") {
56                     allcheck = false;
57                 }
58             });
59             if (allcheck) {
60                 $("#checkedAll").attr("checked", "checked");
61             }
62         }
63         else {
64             $obj.parent().parent().next(‘tr‘).find(‘input‘).each(function () {
65                 $(this).removeAttr("checked")
66
67             });
68             $("#checkedAll").removeAttr("checked");
69         }
70
71
72
73         //var AllChecked=true;
74         //$obj.parent().parent().parent().find(".city").each(function () {
75         //    if($(this).attr("checked")!="checked")
76         //    {
77         //        AllChecked = false;
78         //    }
79         //    if(AllChecked==true)
80         //    {
81         //        $("#checkedAll").attr("checked", "checked");
82         //    }
83         //})
84     }
85     $(function () {
86
87     })
88 </script>

后台代码如下:

 1     public class CheckBoxController : Controller
 2     {
 3         //
 4         // GET: /CheckBox/
 5
 6         public ActionResult Index()
 7         {
 8             List<STU> stuList = new List<STU>()
 9             {
10                 new STU{ID=1,Name="Lily",Age=18,City="NewYork"},
11                 new STU{ID=2,Name="Lucy",Age=20,City="NewYork"},
12                 new STU{ID=1,Name="LiLei",Age=18,City="BeiJing"}
13              };
14             ViewBag.CityList = stuList;
15             return View();
16         }
17
18     }
19     public class STU
20     {
21         public int ID { get; set; }
22         public string Name { get; set; }
23         public int Age { get; set; }
24         public string City { get; set; }
25     }

关键代码讲解:

  1. ViewBag.CityList = stuList;通过ViewBag将列表数据传递到,前台页面中。
  2. var tmp = ViewBag.CityList as List<STU>;获取后台传递过来的列表,并解析成List。
  3. foreach...foreach 解析列表,按照城市进行分组,按照年龄的大小进行组内排序。详情见:C#中对泛型List进行分组输出元素
  4. JQuery代码,当勾选每个学生选项时进行判断,如果同组的其他同学是否被勾选,如果有没有勾选的同学,则城市同样不被选中。
  5. 1         $obj.parent().parent().find(‘input‘).each(function () {
    2             if ($(this).attr(‘Checked‘) != "checked") {
    3                 $obj.parent().parent().prev(‘tr‘).find(‘input‘).removeAttr(‘checked‘);
    4                }
    5         });

    其中,prev方法用来查找前一个同胞元素(同级)。且如果checkbox被选中,该属性的值为checked,否则为undifined。

  5. $("#checkedAll").removeAttr("checked");移除对某checkbox的选中,主要用于各选择元素之间的联动。

问题:最麻烦的是,处理各个元素之间的联动,如全选,或者选择某一城市,或者是选择某一单个同学,都将可能对其他checkbox产生影响。注意上面的JS代码有不完善的地方,请自行处理。

时间: 2024-12-17 13:47:15

如何根据集合动态构建复选框选择控件的相关文章

ASP.NET实现弹出框真分页将复选框选择的数据存到数据库中(一)

ASP.NET实现弹出框真分页将复选框选择的数据存到数据库中,这个问题分一下几步走 1.将弹出框真分页后复选框选择的数据保存. 2.将弹出框保存的数据传到父页面上. 3.将数据在父页面上显示. 4.点击保存将信息存入数据库中. 首先来第一步将弹出框真分页后复选框选择的数据保存. 思路很简单就是先真分页,然后在点击下一页的时候扫描这一页所有点击复选框的数据保存到一个变量数组中.下面就是主要代码: ASP代码: <%@ Page Language="C#" AutoEventWire

Js动态添加复选框Checkbox的实例方法!!!

首先,使用JS动态产生Checkbox可以采用如下类似的语句: var checkBox=document.createElement("input"); checkBox.setAttribute("type","checkbox"); checkBox.setAttribute("id",'123456'); 但是,这样产生的checkbox是不带尾后的文字的,如果需要添加,那么需要使用 document.createTe

ajax动态添加复选框

1 function getLands() { 2 3 $.ajax({ 4 url:"httpserver.do?doPost&userQygs="+$("#userQygs").val(), 5 type:"POST", 6 dataType:"text", 7 8 success:function(data){ 9 10 if(data==null||data==""){ 11 12 aler

jQuery+SpringMVC中的复选框选择与传值

一.checkbox选择 在jQuery中,选中checkbox通用的两种方式: $("#cb1").attr("checked","checked");$("#cb1").attr("checked",true); 对应的jQuery函数,主要完成三个功能: 1.第一个复选框选中或取消选中,则下面的复选框为全选或取消全选: 2.当下面的复选框全部选中时,则将第一个复选框设置为选中,当下面的复选框中有一个没

DevExpress XtraTreeList TreeList复选框选择

权限管理涉及复选框多勾选. 1.控件属性设置 TreeList.OperationView.ShowCheckBoxes=true;用于显示CheckBox: TreeList.OperationBehavior.AllowIndeterminateCheckState=true;  设置CheckBox允许第三种状态. 2.控件事件绑定 要实现选择父级节点选择.子级节点全部选中.父级节点未选择.反之.子级节点部分选中.父级节点为第三种状态. private void treeList1_Aft

实现复选框选择的功能

2015年4月9日 天气冷 这里以"用户授权"为例说明 实现方法一(适合弹出modal的场景): 后台代码如下: /** * 用户授权 * */ public String authorization() throws Exception { //action为0代表请求授权页面,action为1代表需要更新数据到数据库 if (getAction().equals("0")) { user = userService.get(userId); //获得用户所有权限

复选框选择全部或只选单个

//html网页代码 <tr> <td> <input type="checkbox" name="vehicle_qx" id="vehicle_qx" value="0" onclick="vehicle_qx(0)"/><font>全部</font> <input type="checkbox" name="

iOS: 复选框使用---第三方框架SSCheckBoxView-master

在iOS开发中对应用程序进行设置时一般都用UISwitch,偶尔显得单调,这时候你可以选择使用第三方开源类库SSCheckBoxView . SSCheckBoxView是一个可用在iOS上一个复选框UI控件,提供选中和不被选中两种情况,和5中风格,如下图 GitHub下载地址:https://github.com/ardalahmet/SSCheckBoxView 经过封装后的SSCheckBoxView使用起来也很简单,首先初始化它的frame,设置一下显示风格和是否被选中的状态,然后再添加

ExtJs实现复选框组Checkboxgroup单勾选及复选框组对多个复选框组跨控件全选

ExtJs实现复选框Checkboxgroup单勾选及跨控件全选 由于项目的需要,我们要将EXT的控件Checkboxgroup复选框组改造成但勾选,并且实现一个复选框组控制其他多个复选框组的全选,以下是关于如何实现的代码片段. 1.创建CheckboxGroup对象 1,新建空的EOS6.5的工程,新建com.towngas.tcis. gridlock构件包: 2,在com.towngas.tcis.gridlock构件包的"展现"节点下的"页面资源"节点中创建