我想在应用程序中使用CheckedListBox,其中ListBox中的每个项目是我的硬盘驱动器上的文件夹的名称,并且为了从这些文件夹中读取和写入文本文件,我希望确保在CheckedListBox
中,任何时候都可以选择一个且只有一个项目(文件夹)如何通过C#中的代码实现这一目标?
感谢阅读: - )
编辑\更新 - 22/10/2010 感谢所有花时间回复的人 - 尤其是Adrift,他们根据要求更新了最新的代码。
我很欣赏一些评论员以这种方式对我使用checkedlistbox所说的话,但是我认为这完全符合我的目的,因为我希望毫无疑问地将文本文件从哪里读取和写入到。
一切顺利。
答案 0 :(得分:6)
我同意这样的评论,当只有一个项目被“检查”时,单选按钮将成为常用的UI元素,但是如果你想为你的UI坚持CheckedListBox
,你可以试试这样的东西:
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
CheckedListBox.CheckedIndexCollection checkedIndices = checkedListBox1.CheckedIndices;
if (checkedIndices.Count > 0 && checkedIndices[0] != e.Index)
{
checkedListBox1.SetItemChecked(checkedIndices[0], false);
}
}
您还可以为CheckOnClick
将true
设置为CheckedListBox
。
修改强>
更新了评论的代码,以取消选中未选中的项目。问题是取消选中先前检查的项会导致事件再次触发。我不知道是否有一种标准的方法来处理这个,但在下面的代码中,我在调用SetItemCheck
之前分离处理程序,然后重新附加处理程序。它似乎是一种干净的方式来处理这个,它的工作原理。如果我发现有一种推荐的方法来处理这个问题,我会更新我的答案。
HTH
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
CheckedListBox.CheckedIndexCollection checkedIndices = checkedListBox1.CheckedIndices;
if (checkedIndices.Count > 0)
{
if (checkedIndices[0] != e.Index)
{
// the checked item is not the one being clicked, so we need to uncheck it.
// this will cause the ItemCheck event to fire again, so we detach the handler,
// uncheck it, and reattach the handler
checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
checkedListBox1.SetItemChecked(checkedIndices[0], false);
checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
}
else
{
// the user is unchecking the currently checked item, so deselect it
checkedListBox1.SetSelected(e.Index, false);
}
}
}