关于checkedlistbox控制checkbox的问题

zwkycg 2016-04-29 02:50:56
一个checkbox,一个checkedlistbox;现在已经实现用checkbox控制checkedlistbox全选和全不选。代码如下:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
checkedListBox1.SetItemChecked(i, true);
}
}
else
{
for (int i = 0; i < this.checkedListBox1.Items.Count; i++)
{
checkedListBox1.SetItemChecked(i, false);
}
}
}

当点击checkbox使得checkedlistbox全选后,还想实现将checkedlistbox里的某一项前面的勾去掉后,checkbox前面的勾也去掉。代码如下:
private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
if (checkedListBox1.GetItemChecked(i) == false)
{
checkBox1.Checked = false;
break;
}
}
}


但是问题来了:此时,checkbox前面的勾去掉的同时,checkedlistbox所有项前面的勾也都去掉了。调试了一下,发现原因是checkedListBox1_SelectedIndexChanged被调用后,紧接着checkBox1_CheckedChanged被调用,导致把checkedlistbox所有项前面的勾也都去掉了。怎么解决这个问题呢??

另外发现,如果不先点击checkbox,只操作checkedlistbox的话,checkedListBox1_SelectedIndexChanged被调用后checkBox1_CheckedChanged就不会被调用。
...全文
138 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwkycg 2016-05-04
  • 打赏
  • 举报
回复
1楼的朋友正解,感谢!
csdnFUCKINGSUCKS 2016-04-29
  • 打赏
  • 举报
回复
引用 3 楼 ducker3590 的回复:
上面那个有问题,看这个。

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (e.NewValue == CheckState.Checked)
    {
        //如果选中状态为选中时,判断此时选中的items和总items是否相等
        //但此时当前的被操作的item的状态并没有改变,所以要在选中的数量上+1进行比较
        //当满足条件时,先取消checkbox的注册然(防止改变状态后重新触发checkbox的事件)
        //再改变checkbox的选中状态
        //下面取消选中的原理相同
        if (checkedListBox1.CheckedItems.Count + 1 == checkedListBox1.Items.Count)
        {
            checkBox1.CheckedChanged -= new EventHandler(checkBox1_CheckedChanged);
            checkBox1.Checked = true;
        }
    }
    else
    {
        if (checkedListBox1.CheckedItems.Count - 1 < checkedListBox1.Items.Count)
        {
            checkBox1.CheckedChanged += new EventHandler(checkBox1_CheckedChanged);
            checkBox1.Checked = false;
        }
    }
    //重新对checkbox进行事件绑定
    checkBox1.CheckedChanged += new EventHandler(checkBox1_CheckedChanged);
}
20行改为

checkBox1.CheckedChanged -= new EventHandler(checkBox1_CheckedChanged);
csdnFUCKINGSUCKS 2016-04-29
  • 打赏
  • 举报
回复
上面那个有问题,看这个。

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (e.NewValue == CheckState.Checked)
    {
        //如果选中状态为选中时,判断此时选中的items和总items是否相等
        //但此时当前的被操作的item的状态并没有改变,所以要在选中的数量上+1进行比较
        //当满足条件时,先取消checkbox的注册然(防止改变状态后重新触发checkbox的事件)
        //再改变checkbox的选中状态
        //下面取消选中的原理相同
        if (checkedListBox1.CheckedItems.Count + 1 == checkedListBox1.Items.Count)
        {
            checkBox1.CheckedChanged -= new EventHandler(checkBox1_CheckedChanged);
            checkBox1.Checked = true;
        }
    }
    else
    {
        if (checkedListBox1.CheckedItems.Count - 1 < checkedListBox1.Items.Count)
        {
            checkBox1.CheckedChanged += new EventHandler(checkBox1_CheckedChanged);
            checkBox1.Checked = false;
        }
    }
    //重新对checkbox进行事件绑定
    checkBox1.CheckedChanged += new EventHandler(checkBox1_CheckedChanged);
}
csdnFUCKINGSUCKS 2016-04-29
  • 打赏
  • 举报
回复

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (e.NewValue == CheckState.Checked)
    {
        //如果选中状态为选中时,判断此时选中的items和总items是否相等
        //但此时当前被操作的item的状态并没有改变,所以要在选中的数量上+1
        //下面取消选中的原理相同
        if (checkedListBox1.CheckedItems.Count + 1 == checkedListBox1.Items.Count)
            checkBox1.Checked = true;
    }
    else
    {
        if (checkedListBox1.CheckedItems.Count - 1 < checkedListBox1.Items.Count)
            checkBox1.Checked = false;
    }
}
tinydyw 2016-04-29
  • 打赏
  • 举报
回复
= =不要写在checkBox1_CheckedChanged里,换到checkbox.click里去.....

110,555

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧