Je suis d'accord avec les commentaires que les boutons radio seraient l'élément de l'interface utilisateur habituelle quand un seul élément est « vérifié », mais si vous voulez coller avec un CheckedListBox
pour votre interface utilisateur, vous pouvez essayer quelque chose comme ceci:
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);
}
}
Vous pouvez également définir CheckOnClick
à true
pour le CheckedListBox
.
Modifier
mis à jour le code par votre commentaire pour désélectionner un élément si elle est décochée. Le problème est que le fait de décocher l'élément précédemment vérifié provoque le déclenchement de l'événement. Je ne sais pas s'il existe une façon standard de gérer cela, mais dans le code ci-dessous, je détache le gestionnaire avant d'appeler le SetItemCheck
, puis de réattacher le gestionnaire. Cela semble être une manière propre de gérer cela, et cela fonctionne. Si je trouve qu'il y a une façon recommandée de gérer cela, je vais mettre à jour ma réponse.
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);
}
}
}
Je ne pense pas que les cases à cocher sont l'élément de l'interface utilisateur correcte à utiliser lorsque vous autorisez uniquement une seule sélection. –
Vous devriez probablement utiliser une sorte de radiobox puisque les cases à cocher normales ressemblent à la multi-sélection et non à la sélection unique. – CodesInChaos
@CodeInChaos - Merci. J'utilise Visual C# 2010 Express pour développer une application de bureau. Je vois un RadioButton dans la liste des composants disponibles, mais pas un RadioBox - est-ce juste un programmeur - parle d'un certain nombre de radiobuttons liés regroupés? –