Я согласен с комментариями о том, что переключатели будут обычным элементом пользовательского интерфейса, когда «отмечен» только один элемент, но если вы хотите использовать 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);
}
}
}