80 votes

Contrôle de l'utilisateur - Propriétés personnalisées

J'ai développé un contrôle utilisateur dans Visual Studio (WinForms C#) et j'ai une question.

J'ai besoin que l'utilisateur de mon contrôle d'utilisateur puisse modifier certaines valeurs de chaîne et j'aimerais qu'il puisse ajouter le contrôle d'utilisateur à son formulaire et cliquer dessus pour faire apparaître le volet des propriétés où les propriétés personnalisées de mon contrôle d'utilisateur seront affichées.

Comment puis-je avoir mes propres propriétés personnalisées pour mon contrôle d'utilisateur ? Par exemple :

Mon contrôle utilisateur contient un TextBox, et je voudrais que l'utilisateur puisse modifier la valeur de ce TextBox via une propriété nommée "Text" ou "Value" dans les propriétés au moment de la conception.

0 votes

0 votes

Comment votre contrôle contiendra-t-il un contrôle TextBox ? En utilisant l'héritage de classe ou seulement un conteneur ? Pouvez-vous donner quelques codes pour définir la classe du contrôle utilisateur personnalisé ?

116voto

Nick Craver Points 313913

Vous faites cela via les attributs des propriétés, comme ceci :

[Description("Test text displayed in the textbox"),Category("Data")] 
public string Text {
  get => myInnerTextBox.Text;
  set => myInnerTextBox.Text = value;
}

La catégorie est le titre sous lequel la propriété apparaîtra dans la boîte de propriétés de Visual Studio. Voici une référence MSDN plus complète y compris une liste de catégories.

3 votes

Mon VS2010 se plante à chaque fois que je veux générer le projet avec ce code, que j'inclue System.ComponentModel ou non :&.

0 votes

Cela fonctionne pour la plupart des propriétés personnalisées, mais plus particulièrement pour le remplacement de l'attribut Text (ou toute autre propriété qui nécessite une dérogation, je suppose) La réponse de Hans ci-dessous est ce qui fonctionnera.

0 votes

Comment puis-je définir une valeur par défaut pour cette propriété ?

50voto

Hans Passant Points 475940

C'est très simple, il suffit d'ajouter une propriété :

public string Value {
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}

L'utilisation de la propriété Text est un peu plus délicate, la classe UserControl cache intentionnellement il. Vous devrez remplacer les attributs pour le remettre en état de marche :

[Browsable(true), EditorBrowsable(EditorBrowsableState.Always), Bindable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public override string Text {
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}

1 votes

Merci beaucoup ! J'avais complètement oublié celui-là et ça me rendait fou d'essayer de m'en souvenir.

1 votes

Ce devrait être la réponse réellement acceptée. Text est traité d'une manière spéciale

0 votes

Je ne comprends pas vraiment pourquoi il obtient tant de votes non plus. Le compilateur génère un avertissement à ce sujet, et la plupart des visiteurs ont probablement compris qu'il fallait s'en tenir à cette option. new avant lui. Ce qui est normalement une très mauvaise idée mais qui fonctionne par accident pour une UC.

7voto

Jason Williams Points 31901

Il suffit d'ajouter des propriétés publiques au contrôle de l'utilisateur.

Vous pouvez ajouter [Category("MyCategory")] y [Description("A property that controls the wossname")] pour le rendre plus agréable, mais tant que c'est une público il devrait apparaître dans le panneau de propriétés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X