CheckedListBox允许只选中一个项目

17
在我的CheckedListBox应用程序中,我希望只允许选中一个项目。
我已经设置了这些属性。
checkOnClick = true;
SelectionMode = One;

欢迎提供建议


当用户点击列表框时,取消选中其他项目。 - Ben
5
一组单选按钮是否更适合这种情况? - musefan
1
第一个Google搜索结果:http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/5333cdf2-a669-467c-99ae-1530e91da43a/ - Tim Schmelter
似乎 CheckedListBox 继承了 ListBox 的 SelectionMode 属性,但忽略了该属性。 - akatakritos
3
选取和检查是不同的。你可以选中某个东西但没有进行检查。 - Ahmed
3个回答

39

在ItemCheck事件中取消所有其他项目的选中,如下所示:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
      for (int ix = 0; ix < checkedListBox1.Items.Count; ++ix)
        if (ix != e.Index) checkedListBox1.SetItemChecked(ix, false);
    }

谢谢,我以为肯定有一个简单的属性可以做到这一点。 - Ahmed
2
更简单的是单选按钮,客户习惯于单选按钮只有一个选择,而复选框则可以有多个选择,在强制进行此类更改之前,请非常小心。 - RhysW
@Ahmed,正如RhysW所说,你最好使用单选按钮...但如果你必须使用复选框,那么这种方法可以起作用。 - Zaki
@Sam1 当然那样做可能更好,但在这种情况下,我遇到了一个异常不同的场景,这种方法最适合。 - Ahmed
@Ahmed,就像我说的,如果你必须使用它,那么没有理由不使用它 :) - Zaki

9

这个最好的实现方式是这样的:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (e.NewValue == CheckState.Checked && checkedListBox1.CheckedItems.Count > 0)
    {
        checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
        checkedListBox1.SetItemChecked(checkedListBox1.CheckedIndices[0], false);
        checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
    }
}

不循环,总是更好。


0
我们也可以通过checkedListBox1_SelectedIndexChanged事件来实现这一点。
private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int idx = checkedListBox1.SelectedIndex;
        for(int i=0;i<checkedListBox1.Items.Count;i++)
        {
            if(i != idx)
            {
                checkedListBox1.SetItemChecked(i, false);
            }
        }
            
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接