我想在用户点击第一个复选框(全部)时选择和取消选中所有复选框。如果用户取消选中任何复选框,则只有该复选框和第一个复选框(全部)应取消选中,并且不会更改剩余的复选框。
我的页面中有Checkboxlist
,我正在动态填充。
<asp:CheckBoxList runat="server" ID="cbExtList" />
private Extensions _extension = new Extensions();
private ExtCollection _extCollection = new ExtCollection();
_extCollection = _extension.GetAll();
Dictionary<int, string> dExtensions = new Dictionary<int, string>();
dExtensions.Add(0, "All");
foreach (Extensions ext in _extCollection)
{
dExtensions.Add(ext.ID, ext.Extension);
}
this.cbExtList.DataSource = dExtensions;
this.cbExtList.DataTextField = "Value";
this.cbExtList.DataValueField = "Key";
this.cbExtList.DataBind();
现在一切正常。我只想在点击此Checkboxlist
中的第一个复选框“全部”时选择所有扩展程序。
这是我尝试使用代码隐藏方法。
使用OnSelectedIndexChanged
并设置AutoPostBack = True
<asp:CheckBoxList runat="server" ID="cbExtList" OnSelectedIndexChanged="cbExtList_OnSelectedIndexChanged" AutoPostBack="True" />
protected void cbExtList_OnSelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (Convert.ToInt32(this.cbExtList.SelectedItem.Value) == 0)
{
foreach (ListItem li in cbExtList.Items)
{
li.Selected = true;
}
}
else
{
foreach (ListItem li in cbExtList.Items)
{
li.Selected = false;
}
}
}
catch (Exception ex)
{
Monitoring.WriteException(ex);
}
}
答案 0 :(得分:1)
jQuery方法。
这是我实现给定功能所需的唯一jQuery代码。
$(document).ready(function() {
$('[id$=checkAllExts]').click(function () {
$('input:checkbox').not(this).prop('checked', this.checked);
});
$("[id*=cbExtList_]").change(function () {
if ($('input[id*=cbExtList_][type=checkbox]:checked').length == $('input[id*=cbExtList_][type=checkbox]').length) {
$('[id$=checkAllExts]').prop('checked', true);
} else {
$('[id$=checkAllExts]').prop('checked', false);
}
});
});
为了获取ASP.NET控件的ID,我使用了jQuery属性选择器,这是一种更好,更简单的直接方式。
<强> [名$ = “值”] 强>
选择具有指定属性的元素,其值完全以给定字符串结尾。比较区分大小写。
<强> [名称* = “值”] 强>
选择具有指定属性的元素,其值包含给定的子字符串。
所以$('[id$=checkAllExts]')
只返回我选中/取消选中所有复选框的父复选框。
并且$('[id$=cbExtList_]')
会向我返回除父级复选框以外的所有复选框,并相应地执行我的操作。
在客户端使用JavaScript检查和取消选中CheckBoxList
的解决方案。
JavaScript方法。
<script type="text/javascript">
var Counter;
function ExtAll(CheckBox)
{
//Get target base & child control.
var TargetBaseControl = document.getElementById('<%= this.leftCB.ClientID %>');
var TargetChildControl = "cbExtList";
//Get all the control of the type INPUT in the base control.
var Inputs = TargetBaseControl.getElementsByTagName("input");
//Checked/Unchecked all the checkBoxes.
for (var n = 0; n < Inputs.length; ++n) {
if (Inputs[n].type == 'checkbox' && Inputs[n].id.indexOf(TargetChildControl, 0) >= 0)
Inputs[n].checked = CheckBox.checked;
//Reset Counter
}
Counter = CheckBox.checked ? TotalChkBx : 0;
}
function ChildClick(CheckBox, HCheckBox)
{
//get target base & child control.
var HeaderCheckBox = document.getElementById(HCheckBox);
//Modifiy Counter;
if(CheckBox.checked && Counter < TotalChkBx)
Counter++;
else if(Counter > 0)
Counter--;
//Change state of the header CheckBox.
if(Counter < TotalChkBx)
HeaderCheckBox.checked = false;
else if(Counter == TotalChkBx)
HeaderCheckBox.checked = true;
}
</script>
我在复选框列表前添加了一个复选框,以使用其引用来选择/取消选中复选框列表。
在那个复选框上,我在onclick
事件发生时调用JavaScript函数。
<div id="leftCB" class="lbl" style="padding-left: 0px;" runat="server">
<asp:CheckBox runat="server" ID="checkAllExts" Text="All" onclick="javascript:ExtAll(this);" />
<asp:CheckBoxList runat="server" ID="cbExtList" />
</div>
代码背后
private Extensions _extension = new Extensions();
private ExtCollection _extCollection = new ExtCollection();
_extCollection = _extension.GetAll();
Dictionary<int, string> dExtensions = new Dictionary<int, string>();
foreach (Extensions ext in _extCollection)
{
dExtensions.Add(ext.ID, ext.Extension);
// Added the below line for the functionality of CheckBoxList
// which adds an attribute with all of the checkboxes in the CheckBoxList
this.cbExtList.Attributes["onclick"] = string.Format("javascript:ChildClick(this,'{0}');", this.checkAllExts.ClientID);
}
this.cbExtList.DataSource = dExtensions;
this.cbExtList.DataTextField = "Value";
this.cbExtList.DataValueField = "Key";
this.cbExtList.DataBind();
答案 1 :(得分:0)
我已经根据第一个或All
复选框的选中状态,使用jQuery和Javascript来检查/取消选中复选框列表中的项目。
<强> ASPX:强>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.23/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
var checkedState = false;
function checkAll() {
$("input[id^=cblMultiple]").each(function () {
if ($(this).val() == 0) {
checkedState = $(this).is(":checked")
}
else {
$(this).attr("checked", checkedState)
}
//console.log(checkedState);
//console.log($(this).val());
});
}
$(document).ready(function () {
$("input[id^=cblMultiple]").each(function () {
if ($(this).val() == 0) {
$(this).on("click", checkAll);
}
});
});
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:CheckBoxList runat="server" ID="cblMultiple"/>
</form>
</body>
</html>
代码背后
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
cblMultiple.Items.Add(new ListItem("All", "0"));
for (int i = 1; i < 11; i++)
{
cblMultiple.Items.Add(new ListItem("All" + i, i.ToString()));
}
}
}
答案 2 :(得分:0)
如果您需要在选中“所有”复选框时选中所有复选框,并在取消选中所有复选框时将其全部取消选中,还需要禁用每个复选框(除“所有”之外)复选框选中“所有”复选框后,此代码将为您工作。它具有不需要JavaScript / jQuery的额外好处。
这是.aspx代码(在这种情况下,我有九种功能可以任意组合选择):
<asp:Label ID="lblFacility" AssociatedControlID="chkFacility" runat="server" Text="Facility: "></asp:Label>
<asp:CheckBoxList ID="chkFacility" runat="server" OnSelectedIndexChanged="chkFacility_SelectedIndexChanged">
<asp:ListItem Value="All" Text="All"></asp:ListItem>
<asp:ListItem Value="Location1" Text="Location 1"></asp:ListItem>
<asp:ListItem Value="Location2" Text="Location 2"></asp:ListItem>
<asp:ListItem Value="Location3" Text="Location 3"></asp:ListItem>
<asp:ListItem Value="Location4" Text="Location 4"></asp:ListItem>
<asp:ListItem Value="Location5" Text="Location 5"></asp:ListItem>
<asp:ListItem Value="Location6" Text="Location 6"></asp:ListItem>
<asp:ListItem Value="Location7" Text="Location 7"></asp:ListItem>
<asp:ListItem Value="Location8" Text="Location 8"></asp:ListItem>
<asp:ListItem Value="Location9" Text="Location 9"></asp:ListItem>
</asp:CheckBoxList>
以及后面的代码:
protected void chkFacility_SelectedIndexChanged(object sender, EventArgs e) {
//disables all the checkboxes when "All" is selected
if (chkFacility.SelectedIndex==0) {
foreach(ListItem aListItem in chkFacility.Items) {
aListItem.Selected = true;
if (aListItem.Value != "All") {
aListItem.Enabled = false;
}
}
} else if (chkFacility.SelectedIndex > 0) {
var i = 0;
foreach(ListItem aListItem in chkFacility.Items) {
if (aListItem.Selected) {
i++;
}
}
//with the i++ check above, this handles unchecking every checkbox when each location is selected and the "All" checkbox is unchecked
if (i == 9) {
foreach(ListItem aListItem in chkFacility.Items) {
aListItem.Selected = false;
aListItem.Enabled = true;
}
//disables the "All" checkbox in all other cases where 8 or fewer of the 9 locations are selected
} else {
foreach(ListItem aListItem in chkFacility.Items) {
if (aListItem.Value == "All") {
aListItem.Enabled = false;
}
}
}
//if no locations are selected after PostBack, make sure all checkboxes are enabled
} else if (chkFacility.SelectedIndex == -1) {
foreach(ListItem aListItem in chkFacility.Items) {
aListItem.Enabled = true;
}
}
}
不过,此实现的一个警告是,如果通过手动检查每个位置当前都已选择了所有位置,则是否选择了所有位置的代码也会清除选择。在我编写工作代码时,考虑到这种可能性不大,并且考虑到如果需要选择所有位置,则无论如何,用户都应该选中“全部”复选框,这样的边缘情况是可以接受的风险。
答案 3 :(得分:-2)
遍历列表并将items的Selected值设置为true / false:
for (int i = 0; i < cbExtList.Items.Count; i++)
{
cbExtList.Items[i].Selected = true;
}