2010-06-16 4 views
3

Je construis une application client C# qui permet à un utilisateur de communiquer avec un ou plusieurs utilisateurs existants dans un système via une métaphore de type courrier électronique. Je souhaite présenter à l'utilisateur une zone de saisie de texte qui se termine automatiquement sur les adresses e-mail connues et qui permet d'entrer plusieurs adresses séparées par des délimiteurs. Idéalement, j'aimerais aussi que les adresses électroniques deviennent des contrôles structurés une fois qu'ils ont été saisis et reconnus. Fondamentalement, je modélise l'interaction de l'interface utilisateur pour ajouter des utilisateurs après le modèle de Facebook.Comment créer une zone de texte compatible avec Windows Forms?

Existe-t-il des contrôles Windows Forms avec la possibilité de faire quelque chose comme ça? Existe-t-il une terminologie bien établie pour une zone de liste de contrôle hybride/contrôle (non, pas un ComboBox) ou quelque chose que je devrais rechercher?

Merci,

-Patrick

+1

Ce fil a l'air comme il est lié: http://stackoverflow.com/questions/641464/net-control-like-outlooks-e-mail-address-text-control –

+2

en d'autres termes, vous essayez de simuler les perspectives "Pour:" zone de texte. – serhio

Répondre

1

J'ai eu de la chance dans le passé en créant des contrôles utilisateurs composites pour fournir des fonctionnalités spécifiques en utilisant des contrôles Winforms .NET natifs. Cela fonctionne très bien tant qu'il n'y en a pas trop, auquel cas les choses commencent à ralentir. Dans votre cas, et ceci est juste hors de ma tête, mais, peut-être vous pourriez prendre un FlowLayoutPanel, un bouton, et une zone de texte qui prend en charge l'auto-complétion et les mettre ensemble pour créer un contrôle qui fournirait la fonctionnalité que vous recherchez.

Si aucune adresse n'est sélectionnée dans le contrôle (par exemple, dans une chaîne < de la liste >), le conteneur (FlowLayoutPanel) affiche uniquement la zone de texte. Une fois que l'utilisateur a sélectionné une entrée, le contrôle crée automatiquement un bouton avec la légende appropriée et l'insère à gauche dans le FlowLayoutPanel. Si l'utilisateur supprime une adresse qu'il a déjà sélectionnée, supprimez simplement sa représentation (le bouton) du FlowLayoutPanel, et le TextBox peut redimensionner en conséquence. Il peut y avoir des problèmes avec l'obtention de la zone de texte pour remplir l'espace restant (je ne me souviens pas comment faire cela), mais vous avez l'idée. Le conteneur ne doit pas forcément être FlowLayoutPanel - vous pouvez utiliser un Panel avec des contrôles Docked, ou même un TableLayoutPanel pour cela.

Une conception comme je l'ai décrit permettrait à l'utilisateur de supprimer l'adresse en cliquant sur le bouton. Cependant, sans d'autres repères visuels, ce n'est pas très intuitif ou facile à utiliser, donc je considérerais que le "Bouton" soit un autre contrôle composite qui contient une étiquette "prettied-up" avec un minuscule bouton de suppression (X) à droite. Pour cela, vous pouvez utiliser un contrôle Panel et ancrer le bouton X vers la droite, et remplir l'étiquette sur la gauche. Vous devez fournir ici les propriétés publiques nécessaires pour contrôler le texte et fournir un gestionnaire d'événements ou un rappel pour la fonctionnalité de suppression. Une fois que le composant visuel fonctionne, tout ce qui reste est de fournir les propriétés et méthodes appropriées sur le contrôle principal pour lui permettre d'interagir au besoin avec du code externe.

0

En tant que simple, "pauvre homme de", la mise en œuvre, vous pouvez jeter un oeil à la saisie semi-automatique * propriétés du contrôle TextBox. Vous pouvez remplir dynamiquement AutoCompleteSource avec vos adresses connues et lorsqu'une entrée correspond, ajoutez à un contrôle de style de liste distinct de votre choix.

Voir this SO article pour quelques extraits de code intéressants liés à votre question, et ma solution de contournement suggérée. Au-delà des propriétés AUtoComplete intégrées, vous cherchez probablement à acheter un contrôle tiers auprès d'un fournisseur d'outils.

+0

Le problème avec la saisie semi-automatique etc. est que, pour autant que je sache, cela se termine juste pour une seule chaîne. Je veux permettre à un utilisateur de taper quelque chose comme "[email protected], [email protected]" et de le transformer en un objet textbox-ish avec deux éléments cliquables dedans, comme on peut s'y attendre dans un client de messagerie ou Facebook etc. –

0

Je n'avais jamais rien vu de tel dans WinForms. Dans WPF, ce serait une autre affaire - si vous pouvez l'utiliser, peut-être envisager d'héberger un contrôle WPF dans votre application WinForms à la place?

+0

Avez-vous des pointeurs pour faire cela dans WPF? –

+0

Je ne l'ai jamais fait moi-même - mais je suis plutôt un contrôle WPF hébergé pour WinForms en standard dans VS qui hébergera un contrôle WPF. Je suis sûr qu'un rapide Google/Bing vous donnera de bons résultats. –

0

Je pense que vous essayez de faire quelque chose de semblable à cet article CodeProject: AutoComplete TextBox

Et puisque vous mentionnez WPF dans un commentaire, vous avez aussi cet article: WPF AutoComplete Folder TextBox (devrait être assez facile à découper le dossier peu de l'article que j'avais pensé).

0

Eh bien, il n'y a pas un tel contrôle. Si j'étais vous, je créerais 2 boîtes de texte pour faire le travail. Vous voyez, une zone de texte normale peut facilement être configurée pour la saisie semi-automatique à partir d'une liste, même dynamiquement; cependant, il n'accepte qu'une seule entrée à la fois. Donc, je vous suggère de dédier une zone de texte pour la saisie semi-automatique, et une pour les adresses. Ainsi, chaque fois qu'une adresse e-mail qualifiée figure dans la première zone de texte, et que vous cliquez sur Entrée, l'adresse est ajoutée à la zone de texte de l'adresse et ajoute automatiquement la délimitation.

Ensuite, vous devez gérer les adresses dans la zone de texte de l'adresse en tant qu'objets au lieu de caractères. Codez-le de telle sorte que lorsqu'un utilisateur tente de supprimer un caractère dans une adresse, l'adresse complète est supprimée.

C'est la solution de contournement que je peux penser. Je vais vous aider avec le code si vous essayez.

Questions connexes