Envoyer des Données de formulaire enfant à Parent Forme de zone de texte
J'ai un Formulaire Parent qui détient une "PALETTE" avec prénom, Nom, etc. L'une des formes d'enfants est une Forme de Recherche. Lorsque l'utilisateur sélectionne un membre de résultats qui sont affichés dans une grille de données, je veux l'information pertinente pour de remplissage dans la PALETTE. J'ai créé une classe de HUD avec des variables pour chaque valeur et une méthode appelée UpdateHUD(). Je suis pas sûr de la façon d'obtenir ce travail. J'ai une référence dans le Formulaire de Recherche de la société Mère en la forme et contenant la PALETTE, comme suit:
public frmWWCModuleHost _frmWWCModuleHost;
C'est le code que j'utilise pour incorporer des formes. Je ne suis pas à l'aide de MDI.
public static void ShowFormInContainerControl(Control ctl, Form frm)
{
frm.TopLevel = false;
frm.FormBorderStyle = FormBorderStyle.None;
frm.Dock = DockStyle.Fill;
frm.Visible = true;
ctl.Controls.Add(frm);
}
Voici le code, je suis en cours d'exécution sur la Cellule, Cliquez sur le Formulaire de Recherche. C'est un avant j'ai essayé la mise en œuvre de la PALETTE classe.
private void dgvSearchResults_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
_frmWWCModuleHost = new frmWWCModuleHost();
_frmWWCModuleHost.tbxHUD_LastName.Text = dgvSearchResults.CurrentRow.Cells[1].FormattedValue.ToString();
_frmWWCModuleHost.tbxHUD_LastName.Invalidate();
_frmWWCModuleHost.FormPaint();
}
Merci d'avance!
~ Patrick
MODIFIER
dgvSearchResults_CellContentClick est maintenant en cours. Quand je marche par le biais de ce code, il est d'obtenir la Valeur correcte ici, mais il n'est jamais mise à jour de la réelle PALETTE.
EDIT 2
Est mon problème que je suis de déclaration d'un NOUVEAU frmWWCModuleHost au lieu de passer d'une référence à l'existant? Je suis encore assez faible dans ma compréhension de cette.
MODIFIER 3
J'ai "résolu" ce, de la manière suivante: Sur le Formulaire Parent où je déclare le Formulaire d'Enfant je passe ce comme un param. Puis dans le constructeur du formulaire enfant, j'ai ajouté _frmWWCModuleHost = m_parent; j'ai un UpdateHUD() la méthode sur mon formulaire Parent et j'appelle ça de la _CellClick événement sur l'enfant.
Maintenant pour reformuler ma question; Est-il rien flagrante de mal avec cette façon de faire?
OriginalL'auteur Refracted Paladin | 2009-04-01
Vous devez vous connecter pour publier un commentaire.
Lorsque l'enfant formulaire de recherche terminée, faire un "SearchCompleted" de l'événement. Alors quoi que ce soit (y compris le formulaire parent) peuvent s'inscrire à cet événement et récupérer les informations.
Voir la suite NotepadCode pour un exemple:
Vous appelez OnSearchCompleted de la cellule/ligne cliquez, ayant pris les données de la ligne sélectionnée/cellule.
Douh! Je vais donner à ceci un essai.
J'ai, évidemment, je ne suis pas jusqu'à ce moment. J'obtiens des erreurs avec cette approche. Je suis peut-être prendre votre code à la lettre. Je suppose, où il est dit arg valeurs que je devrais mettre les valeurs à transmettre.
Oui. Tu aurais peut-être juste passer le DataRow ou Modèle du Domaine de l'objet qui est lié à la ligne sélectionnée dans la grille. De cette façon, la chose observation de l'événement peut faire ce qu'il veut avec.
OriginalL'auteur Neil Barnwell
.NET, les Formes sont des objets comme tout le reste, alors vous devriez penser le problème en ces termes.
Avec que, le formulaire enfant aura besoin d'accéder au formulaire parent. Vous pouvez fournir qu'en transmettant le formulaire parent de référence de l'enfant par le constructeur, une méthode ou un champ/propriété (bien que le constructeur a fait le plus de sens).
Ensuite, vous pouvez modifier les valeurs dans le formulaire parent de l'enfant.
CEPENDANT je dirais que ce n'est pas la meilleure idée. Plutôt, l'enfant doit présenter un événement indiquant que la modification de données (ainsi que le mécanisme pour obtenir des données) et ensuite, le parent doit s'abonner à cet événement et se mettre à jour avec les données quand il est tiré.
D'accord, je pense que c'est MAINTENANT ce que je fais. Dans le Constructeur. Pourriez-vous dire pourquoi je ne devrais pas le faire de cette façon? Merci!
Eh bien, c'est à propos de la séparation des préoccupations. Avec votre approche, l'enfant forme a une connaissance intime de la mère, et c'est la seule relation de prise en charge. Avec un événement, l'enfant n'a pas de soins qui répond aux données, et qui rend la classe plus réutilisable.
OriginalL'auteur casperOne
Parfois dans des situations comme cela, je vais créer un délégué qui correspond à la signature de la méthode que j'ai envie d'appeler la classe parent (je pense que ce serait UpdateHUD dans votre cas), puis de passer une instance de ce délégué (c'est à dire une référence à UpdateHUD) à l'enfant la forme (le formulaire de recherche dans ce cas). Lorsque le formulaire enfant est fini accepter l'entrée, il appelle le délégué à l'aide de données recueillies sur le formulaire.
Donc, dire UpdateHUD est une méthode dans le formulaire parent qui ressemble à quelque chose comme ça.
Vous créez un délégué avec la même signature, comme ça.
Vous pouvez ensuite ajouter un HUDUpdateHandler paramètre dans le constructeur du formulaire enfant et de le stocker dans un champ privé (par exemple,
this.handler = handler
). Lorsque votre enfant est prêt à envoyer ses données, vous appeler l'enfant en forme du champ privé (this.handler.Invoke(firstNameTextBox.Text, lastNameTextBox.Text)
, par exemple). Qui invoque UpdateHUD dans votre classe parent en utilisant les valeurs de la classe enfant, et vous n'aurez pas d'exposer quoi que ce soit.Je trouve cette approche plus simple à mettre en œuvre que la sensibilisation et la détection d'événements, et il vous permet de garder l'intérieur de votre parent de la classe interne.
Vous pouvez créer n'importe où tant que c'est dans la portée à la fois le parent et l'enfant. J'ai l'habitude de créer dans le même fichier de code en tant que parent, mais je n'ai pas de nid au sein de la classe parent lui-même. Il n'a vraiment pas d'importance, même si, comme longtemps que c'est dans la portée.
Je pense que cette approche est la meilleure, merci!
OriginalL'auteur John M Gant