Changer le champ de texte de la ComboBox lorsqu’un élément est sélectionné dans la liste déroulante?

J’ai une ComboBox sur un formulaire. La propriété DropDownStyle de la zone de liste déroulante est définie sur DropDown , afin que l’utilisateur puisse sélectionner un élément dans la liste déroulante ou taper du texte manuellement.

Lorsque l’utilisateur sélectionne un élément dans la liste déroulante, j’aimerais apporter quelques modifications au texte de l’élément avant qu’il n’apparaisse dans le champ de texte de la ComboBox. Pour utiliser un exemple très simplifié, supposons que la liste déroulante contienne des éléments consistant en un ID et une description, comme suit:

 101 Cat 102 Dog 103 Bird 

Lorsque l’un de ces éléments est sélectionné, j’aimerais que seule la description apparaisse dans le champ de texte de la ComboBox. Ainsi, lorsque “102 Dog” est sélectionné, la chaîne “Dog” doit être affichée dans le champ de texte, prête à être modifiée par l’utilisateur, et les éléments de la liste déroulante ne doivent pas être modifiés.

J’ai pensé que je pourrais simplement écouter, par exemple, l’événement SelectionChangeCommitted du ComboBox et définir la propriété Text du ComboBox sur tout ce que je veux. Mais si je le fais, les modifications apscopes à Text sont ignorées et la chaîne entière (“102 Dog”) est toujours affichée dans la zone de liste déroulante.

Alors, j’ai alors pensé que je devrais également mettre à jour le champ SelectedIndex sur -1, pour indiquer à la ComboBox que le Text je suis en train de définir n’est pas un élément de la liste déroulante. Mais cela efface simplement le champ de texte complètement, indépendamment de ce que je change en propriété Text .

Alors, j’ai alors pensé que SelectionChangedCommitted était le mauvais événement à utiliser, car il semble se déclencher trop tôt pour mes besoins (la propriété Text semble être mise à jour avec ma sélection qu’après la fin du gestionnaire d’événements SelectionChangeCommitted ). Toutefois, tous les autres événements ComboBox ne fonctionnent pas, notamment SelectedIndexChanged et DropDownClosed .

Je pensais que ce serait assez sortingvial à réaliser. Il doit y avoir un moyen simple de faire cela, et je suis sûr que je manque quelque chose d’évident … des idées?

Vous pouvez essayer ceci:

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (comboBox1.SelectedIndex > -1) { ssortingng value = comboBox1.Items[comboBox1.SelectedIndex].ToSsortingng().Subssortingng(4); this.BeginInvoke((MethodInvoker)delegate { this.comboBox1.Text = value; }); } } 

Juste pour clarifier, est-ce que vous affichez “101 Cat”, “102 Dog”, etc. lorsque l’utilisateur dépose la liste déroulante et les affiche lorsqu’il est sélectionné? 101 est-il la clé du “chat”, 102 la clé du “chien”, et ainsi de suite? Si oui, pourquoi les affichez-vous et pas seulement le texte de chaque élément (si tel est votre souhait, excusez ma réponse). Pour ce que je comprends, je vais configurer la liste déroulante valuemember sur la propriété qui vous renvoie les valeurs 101, 102, etc., et displaymember sur la propriété qui vous renvoie le texte de chaque élément. De cette façon, vous obtiendrez déjà ce que vous voulez, c’est-à-dire en affichant le texte “Chat”, “Chien” et “Oiseau”. Vous pouvez également attacher un événement à l’événement TextChanged du combo si vous souhaitez un traitement plus poussé.