2008-12-27 7 views
0

J'ai le scénario suivant J'ai un formulaire principal en tant que parent MDI et formulaire enfant MDI, le formulaire enfant affiche un nouveau formulaire (je l'ai appelé mydialog). Je veux accéder à la fonction spécifique dans le formulaire enfant MDI de mydialog donc j'ai essayé de définir la propriété Owner dans l'objet mydialog mais l'exception est survenue (exception de référence circulaire) aussi les propriétés Parent et ParentForm de mydialog sont nulles, j'ai fait un rapide et sale soluion en utilisant la propriété Tag de mydialog. Je cherche une meilleure solution et pourquoi il y a une exception quand je mets la propriété Owner de mydialogPassage de données entre les formulaires

+0

vous devriez mettre dans l'exception avec votre question :) –

+0

l'exception est "Une référence de contrôle circulaire a été faite.Un contrôle ne peut pas être détenue par ou parented à lui-même." pour le code suivant groupsettingsform myDialog = new groupsettingsform(); // créer de dialogue mydialog.Owner = this; // propriétaire = MDI enfant sous forme mydialog.ShowDialog (this); // afficher la boîte de dialogue –

+0

Vous avez vos références mélangé. L'erreur vous indique exactement ce que vous faites mal. Vous définissez accidentellement le parent du formulaire sur lui-même. Il semble que votre formulaire enfant ne soit pas défini comme enfant MDI. Assurez-vous que la propriété parent MDI est définie avant d'appeler Show(). –

Répondre

1

donc j'ai essayé de définir la propriété du propriétaire dans l'objet myDialog mais exception ont été observés (exception référence circulaire)

Il devrait y avoir aucune exception lors du réglage du Propriété du propriétaire. Pouvez-vous coller l'exception? Aussi pourriez-vous coller votre code qui définit cette valeur? Avez-vous défini d'autres propriétés comme MDIParent/etc?

EDIT: Code mise à jour

Essayez ce qui suit, il devrait fonctionner

groupsettingsform mydialog= new groupsettingsform(); //create dialog 
mydialog.Owner= this; //set owner MDI child form 
mydialog.ShowDialog(); // <== DO NOT PASS THE OWNER 
+0

c'est mon code simple (existe dans le formulaire enfant MDI) groupsettingsform mydialog = new groupsettingsform(); // crée un dialogue mydialog.Owner = this; // Définir le propriétaire MDI enfant formulaire mydialog.ShowDialog (this); si je commente la ligne de Owner = this, le propriétaire de mydialog sera le formulaire parent MDI –

+0

merci mais ce qui se passe réellement, pourquoi quand j'ai supprimé le paramètre passing le propriétaire sera MDI enfant, et si je l'ai passé (sans définir le propriétaire explicitement) le propriétaire sera parent MDI ?? –

+0

Oui. Un peu étrange. J'essaie de résoudre le mystère ;-) – Preets

0

Pouvez-vous nous montrer le code que vous utilisiez pour montrer la boîte de dialogue, Une des méthodes ShowDialog prend un objet parent comme un paramètre qui peut faire ce que vous cherchez.

0

vous pouvez créer un constructeur paramétrés dans MyDialog comme

public MyDialog(object param1) 

passer vos données

MyDialog frm = new MyDialog("data"); 
frm.ShowDialog(); 

ou créer une propriété publique à MyDialog comme

public object Data {get; set;} 

et définir quand instancier votre boîte de dialogue

MyDialog frm = new MyDialog(); frm.Data = "vos données ici"; frm.ShowDialog();

HTH,

+0

il est bon mais je pense qu'il n'est pas le meilleur comme si je veux accéder à beaucoup de données de formulaire enfant MDI je dois le copier dans mydialog formulaire –

0

Réglage du propriétaire ne doit pas jeter une exception ... Essayez ceci en vous forme MyDialog

((YourMDIChildForm)Owner).YourMDIChildFormMethod(); 
0

Ma réponse simple jusqu'à maintenant est d'utiliser la propriété Tag, mais je pense qu'il y a un meilleur moyen

groupsettingsform mydialog = new groupsettingsform(); mydialog.Tag = ceci; mydialog.ShowDialog (this);

0

Je préfère transmettre des données ou des paramètres personnalisés au formulaire par son constructeur. C'est la manière la moins spécifique à "WinForms" et en fait n'est pas différente de la construction de la plupart des autres objets.

Dans d'autres cas, j'aime définir les propriétés sur le formulaire. Cela semble être aussi une convention WinForms.

Il est préférable d'utiliser Tag ou de tirer des données du propriétaire. Comme les deux nécessitent un moulage explicite, ils ne sont pas particulièrement élégants.

Questions connexes