2009-06-19 7 views
0

Étant donné une instanciation publique d'une classe dans WinForm1, j'essaie d'ouvrir WinForm2 et d'obtenir des requêtes DB dont j'utilise la requête pour remplir l'instance de classe dans WinForm1. Cependant, je ne peux pas comprendre comment accéder à l'instance de classe dans WinForm1 à partir de WinForm2.Dans .NET (C#), comment faire référence à une variable dans un WinForm à partir d'un WinForm enfant?

L'instance de classe WinForm1 est codée en tant que membre privé/propriété publique:

private theClass _classInstance; 
public theClass ClassInstance {get; set;} 

J'appelle WinForm2 comme une forme modale.

WinForm2 wf2 = new WinForm2(); 
wf2.ShowDialog(this); 

Y a-t-il moyen que je puisse me référer à ClassInstance (en modifiant sa valeur) alors que dans wf2 ??

Répondre

3

Vous pouvez transmettre une référence au formulaire parent dans le constructeur ou en tant que propriété au formulaire enfant ou conserver la référence dans un champ static.

class WinForm2 : Form { 
    WinForm1 parentForm; 
    public WinForm2(WinForm1 parentForm) { 
     this.parentForm = parentForm; 
     // .... 
    } 

    // Use `parentForm.ClassInstance` here. 
} 


WinForm2 wf2 = new WinForm2(this); 
wf2.ShowDialog(this); 

Soit dit en passant, quand vous déclarer une propriété automatique comme celui que vous avez spécifié, vous ne devriez pas créer manuellement un champ de support. Le compilateur prend soin de cela pour vous.

+0

heh. Vous y êtes arrivé un peu plus vite, mais n'oubliez pas que le constructeur doit toujours appeler InitializeComponent. Vous pouvez le faire comme je l'ai fait ci-dessous en enchaînant les constructeurs ou en le faisant manuellement dans le corps du nouveau constructeur, mais en le laissant dehors, ça fera mal. –

+0

@Jacob: Le "// ...." que j'ai écrit signifie d'autres choses dans le constructeur;) –

+0

Je sais. Je veux juste que ce soit explicite car c'est un truc facile à éviter. –

0

Vous pouvez créer un constructeur sur WinForm2 qui accepte un WinForm1 à l'instanciation.

public partial class WinForm2 : Form 
{ 
    public WinForm2() 
    { 
     InitializeComponent(); 
    } 

    Form parentForm 
    internal WinForm2(Form parent) 
     : this() 
    { 
     parentForm = parent 
    } 
} 
0

à WinForm2 (amélioré pour éviter les pannes d'exécution possibles Mehrdad) ont souligné:

WinForm1 form1 = this.Owner as WinForm1; 
if (form1 != null) { 
    theClass classInstance = form1.ClassInstance; 
    // ... 
} 

propriété du propriétaire retourne la forme qui a été passé à ShowDialog(IWin32Window window)

+0

Je ne le ferais pas de cette façon si le formulaire est * requis * pour avoir un formulaire parent de type WinForm1. Cela peut échouer à l'exécution si ce n'est pas le cas, mais l'approche du constructeur force la création du formulaire enfant avec un formulaire parent connu. –

+0

Vous avez absolument raison, je viens d'améliorer ma réponse: je préférerais ne pas toucher le constructeur pour permettre la création du dialogue sans WinForm1 attaché – Utaal

Questions connexes