Dans mon application WinForms, il y a un ComboBox avec des valeurs par défaut. L'utilisateur doit pouvoir ajouter des éléments à la zone de liste déroulante ou renommer des éléments existants.
Je veux que le design soit simpliste. C'était mon approche initiale:
Si l'utilisateur tape quelque chose dans la zone de liste déroulante et appuie sur Entrée et que l'élément existe, sélectionnez-le. Si l'élément n'existe pas, ajoutez-le.
Si la zone de liste déroulante est vide lorsque l'utilisateur clique sur Entrée, supprimez l'élément à l'index en cours.
Cela a bien fonctionné, à l'exception de ces deux problèmes:
Comme il s'agissait d'un contrôle d'interface utilisateur personnalisé, la fonctionnalité n'est pas intuitive.
Si l'utilisateur supprime un élément de la zone de liste déroulante et qu'il y a des éléments après celui-ci, leurs indices sont ajustés en conséquence. Fondamentalement, chaque index d'élément après cet élément est repoussé vers le bas 1. C'est mauvais car une fois qu'un élément est ajouté, son index ne doit pas être modifié car d'autres services peuvent en dépendre. Essentiellement, les éléments ne doivent pas être supprimés. Seulement renommé. Peut-être à blanc si elles ne sont plus nécessaires.
La seule vraie solution à laquelle je peux penser est d'avoir une boîte de dialogue séparée mais je ne peux pas imaginer une bonne conception de celle-ci.
Voici un exemple pour la première implémentation à laquelle on pourrait penser:
Demandez à un élément de menu d'ouvrir une boîte de dialogue dans le but d'ajouter ou de renommer des éléments du ComboBox.
Avoir un TextBox pour chaque élément dans le ComboBox dans cette fenêtre de dialogue. Si le dernier TextBox n'est pas vide, ajoutez-en un autre (ou disposez d'un bouton pour ajouter un autre TextBox).
Je suppose que cette approche est bonne, mais je ne l'aime pas pour quelques raisons.
Si l'utilisateur a beaucoup d'éléments dans la zone de liste déroulante, la fenêtre de dialogue serait immense ou nécessiterait une barre de défilement.
Cette approche nécessite un élément de menu, une fenêtre de dialogue correspondante et une grande quantité potentielle de contrôles dynamiques.
J'ai essayé de penser à une meilleure façon d'aborder cela, mais je n'ai pas de chance.
Il semble que vous utilisez ComboBox pour qu'il n'a pas été créé. ComboBox stocke une liste fixe d'éléments dans sélectionner. Si vous devez modifier cette liste, utilisez un formulaire séparé pour modifier les éléments. Ce serait plus intuitif, faites confiance. Sinon, veuillez utiliser la grille, par exemple. Il est plus "modifiable".
Ce que vous recherchez est (je pense) une zone de texte de saisie automatique.
Cela permet à l'utilisateur d'ajouter du texte, mais fait correspondre l'entrée à une liste prédéfinie, puis permet à l'utilisateur de sélectionner l'un des éléments de cette liste. Vous pouvez voir ceci où l'utilisateur doit entrer un état ou un pays.
Dans votre cas, vous souhaitez ajouter à la liste toute entrée qui ne figure pas déjà dans la liste - ce qui est possible.
Votre exigence de suppression est également possible - mais notez que dans Outlook qui a des fonctionnalités similaires lors de la saisie de destinataires de courrier électronique, il utilise Shift+Delete pour supprimer des éléments.
Cet article de blog a un exemple de comment en créer un dans WinForms. Je ne répéterai pas le code ici car ce n'est pas nécessaire.
Même à cette date tardive, ce message est toujours utile. Pour ajouter un élément qu'un utilisateur a saisi au contrôle ComboBox,
dans la méthode de l'événement KeyDown, vérifiez le KeyEventArgs e.KeyCode. Si l'utilisateur appuie sur la touche Entrée, (Keys.Enter), vérifiez si l'élément est déjà dans la liste des éléments:
private void cmbUserNouns_KeyDown (expéditeur d'objet, KeyEventArgs e) {
chaîne s = cmbUserNouns.Text;
if (e.KeyCode == Keys.Enter)
{
// si l'élément existe, sélectionnez-le. s'il n'existe pas, ajoutez-le.
if (! cmbUserNouns.Items.Contains (s))
{
cmbUserNouns.Items.Add (s);
}
}
}
Je viens de tester cela et cela semble bien fonctionner!