De contrôle de l'utilisateur dans l'application windows forms
J'ai un contrôle utilisateur simple avec une zone de texte et l'étiquette en elle. J'ai créé propriétés publiques pour accéder au texte dans la zone de texte lorsque j'utilise le contrôle de l'utilisateur sous une autre forme.
Mon problème est la propriété retourne la valeur null lorsque je l'appelle dans la forme. Ai-je raté quelque chose?
Ma propriété est la suivante:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public string rtnTxtMake
{
get
{
return txtMake.Text;
}
set
{
txtMake.Text = value;
}
}
}
et ce, dans les formes de l'événement clic du bouton j'appelle la propriété comme suit
UserControl1 Usc = new UserControl1();
string Make = Usc.rtnTxtMake;
MessageBox.Show(Make)
- Avez-vous jamais
txtMake.Text
à quelque chose? - j'ai entrez des valeurs dans la zone de texte quand je lance l'application.est n pas suffisant?
- manuellement lorsque j'ai affecté txtMake.Texte à une certaine valeur.je suis en mesure d'obtenir les résultats recherchés.mais comment puis-je attribuer la valeur saisie au cours de l'exécution de txtMake.Texte????????
- Ewww, la notation hongroise
- Il n'y a rien de mal avec la création d'un UserControl au moment de l'exécution, en réponse à un Clic sur un Bouton ! Les autres observations/réponses déjà de vous le rappeler : vous devez l'ajouter à un valide "conteneur" (la Forme, Panneau, etc.) pour l'utiliser, et vous devrez le faire à l'intérieur de l'événement Click du Bouton : depuis le contrôle utilisateur que vous créez sera "hors de portée" lorsque l'événement Click sorties. Dans la plupart des cas, vous aurez envie de conserver une référence à la fonction nouvellement créée de UserControl pour y accéder plus tard : si c'est une variable spécifique déclarée à la Forme-niveau d'étendue, ou d'une entrée dans une Liste<UserControl> dépend de votre conception et le but.
Vous devez vous connecter pour publier un commentaire.
Si votre contrôle utilisateur dispose par défaut d'une zone de texte vide, puis il semble correct que les deux lignes de code serait de retour soit
null
ouString.Empty
(vérifier viaString.IsNullOrEmpty
), depuis que vous avez explicitement de créer une nouvelle instance de votre contrôle de l'utilisateur.Je suppose que ce que vous voulez vraiment est-ce:
Vous avez inséré un contrôle utilisateur dans un formulaire dans le Concepteur. Appelons cette instance de contrôle utilisateur
ctlUser
.Vous avez un bouton avec un
Click
gestionnaire d'événement. Le dernier quelques lignes de code dans votre question, à partir de cette méthode de gestionnaire d'.Dans le gestionnaire, vous ne pouvez pas créer une nouvelle instance de votre contrôle de l'utilisateur (
Usc
), mais se référer à l'un que vous avez déjà inséré dans votre formulaire,ctlUser
. Ensuite, les choses devraient fonctionner comme prévu.Votre UserControl doit être ajouté à la collection de Contrôles d'un Formulaire parent/Contrôle avant qu'il puisse être correctement initialisé. Normalement, vous ne voudrais pas écrire le code vous-même qui crée et ajoute le contrôle UserControl.
Au lieu de cela, d'abord à construire votre projet, puis aller à la Deisgner vue de votre formulaire principal et de regarder la boîte à outils.
Votre UserControl (nom et une icône devrait apparaître vers le haut de la boîte à outils, et vous pouvez simplement faire glisser sur le formulaire principal. Le concepteur Windows Forms va automatiquement générer un code d'initialisation pour vous.
Vous ne devez pas créer une nouvelle instance de votre commande dans votre event handler. À l'aide de la démarche design pour créer votre contrôle, vous pouvez simplement accéder à l'instance existante de votre contrôle, comme suit:
Exactement ce que vous voulez dire quand vous dites que la propriété est de retourner une valeur nulle? Est-il réellement nulle, ou est votre MessageBox simple montrant vide?
J'ai rapidement dupliqué votre code et il se comporte exactement comme prévu - la MessageBox montre, mais il est vide, car la valeur par défaut de la propriété Text du contrôle de zone de texte est une chaîne vide.
Aussi, la façon dont vous vous approchez de ce qui est un peu inhabituel.
Tout d'abord, la ligne:
Vous n'avez généralement pas besoin d'instancier un contrôle utilisateur de ce genre. Au lieu de cela, vous pouvez faire glisser la commande à partir de la boîte à outils sur la conception de la surface de votre formulaire. Ce seront alors prendre soin d'instancier et initialiser votre contrôle pour vous.
Je pense que c'est en fait votre problème quand vous incluez la ligne de code ci-dessus, vous créez une nouvelle instance de contrôle de l'utilisateur, et ce n'est pas une façon realted à l'utilisateur de contrôler que vous avez glissé sur le concepteur.
Si vous allez à la vue du concepteur de votre formulaire et cliquez sur le contrôle de l'utilisateur, vous devriez voir une fenêtre de propriétés somehere. Si vous ne le faites pas, puis sélectionner à partir du menu Affichage ou appuyez sur F4. Dans la liste des propriétés, il devrait y avoir un "Nom" c'est la programatic nom généré pour votre contrôle de l'utilisateur. Vous pouvez le changer si vous le voulez, mais quand vous vous référez à ce contrôle dans le reste de la forme, c'est ce que vous devez utiliser.
Deuxièmement, les deux lignes suivantes:
Vous pouvez accéder à la propriété rtnTxtMake directement. Sauf si vous devez accéder à la Rendre chaîne dans le reste de votre code, puis directement en accédant à la propriété serait normalement considéré comme meilleur style.