2010-10-20 37 views
3

Je veux utiliser un CheckedListBox dans une application où chaque élément dans le ListBox est le nom d'un dossier sur mon disque dur et dans le but de lire et d'écrire des fichiers texte vers et à partir de chacun de ces dossiers, je veux m'assurer et un seul élément (un dossier) peut être sélectionné à la fois dans le CheckedListBoxCheckedListBox - Comment assurer par programme qu'un seul et même élément peut être vérifié à un moment donné?

Comment puis-je l'obtenir via le code en C#?

Merci pour la lecture :-)

Modifier \ Update - 22/10/2010 Merci à tous ceux qui ont pris le temps de répondre - en particulier Adrift dont le code mis à jour à la demande fonctionne parfaitement. J'apprécie ce que certains commentateurs ont dit à propos de mon utilisation d'une liste de contrôle de cette manière, mais je pense que cela correspond parfaitement à mes objectifs car je ne doute absolument pas de savoir où les fichiers texte seront lus et écrit à.

Tout le meilleur.

+3

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. –

+0

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

+0

@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? –

Répondre

6

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); 
     } 
    } 
} 
+0

Merci à la dérive. J'ai collé votre code ci-dessus dans Form1.cs, puis ajouté this.checkedListBox1_ItemCheck + = new System.Windows.Forms.ItemCheckEventArgs (this.checkedListBox1_ItemCheck); à Form1.Designer.cs, mais il cherche un autre argument - j'ai essayé "expéditeur d'objet" et aussi "expéditeur" mais aucun ne semble fonctionner. Aucune suggestion? –

+0

@La chose, vous n'avez pas besoin d'ajouter cela manuellement à Form1.Designer.cs. Si vous supprimez la ligne que vous avez ajoutée, vous pouvez accéder à la feuille de propriétés, cliquer sur le bouton pour afficher la liste des événements pour la listeListe, et dans l'événement ItemCheck, vous devriez pouvoir choisir ce gestionnaire d'événements dans une liste déroulante. –

+0

@The Thing, si vous voulez juste corriger la ligne que vous avez ajouté manuellement, il devrait ressembler à ceci: 'this.checkedListBox1.ItemCheck + = new System.Windows.Forms.ItemCheckEventHandler (this.checkedListBox1_ItemCheck);' –