2009-10-13 11 views
0

J'ai une forme enfant qui a une forme de recherche dedans. Je mets le propriétaire formulaire de trouver la forme de l'enfant comme ceci:Comment définir un enfant MDI comme propriétaire d'un autre formulaire?

private void ShowFindForm() 
{ 
    FindForm.Show(this); 
} 

qui me permet alors d'accéder à ses propriétés comme ceci:

private void FindNext() 
{ 
    TreeNode matchingNode = ... 
    ... etc 
    ... etc 

    OwnerForm form = this.Owner as OwnerForm; 
    form.TreeView.SelectedNode = matchingNode; 
} 

Cela fonctionne parfaitement bien jusqu'à ce que je shove la forme de propriétaire dans un Formulaire MDI, dans lequel la forme MDI prend rapidement possession du formulaire de recherche et gâche le tout. Comment puis-je contourner cela?

MISE À JOUR:

Je peux pirater autour de ce en parcourant la propriété MdiChildren de formulaire MDI jusqu'à ce que je trouve la forme que je veux, mais cela semble un cow-boy ish peu.

Répondre

0

Une solution simple à ce problème est de créer une propriété OwnerForm publique sur votre formulaire enfant comme celui-ci:

public OwnerForm myOwner; 

puis modifiez votre méthode ShowFindForm() à ceci:

private void ShowFindForm() 
{ 
    FindForm.myOwner = this; 
    FindForm.Show(this); 
} 

et changement l'avant-dernière ligne de la méthode FindNext() de votre formulaire enfant:

OwnerForm form = this.myOwner; 

myOwner devrait probablement être une propriété privée avec des méthodes get et set publiques, mais ceci est juste pour illustrer le principe. Fondamentalement, au lieu de supposer que le propriétaire de votre formulaire enfant est le formulaire dont vous voulez accéder aux propriétés (une hypothèse qui casse dans le monde MDI, comme vous l'avez trouvé), vous créez explicitement une référence au formulaire que vous voulez. En guise de remarque, beaucoup considéreraient votre exemple de code comme une violation du principe d'encapsulation de la POO, puisque vous manipulez les contrôles d'un formulaire à partir d'un autre formulaire. J'ai vu des crimes plus graves contre l'humanité, moi-même.

+0

Il he. Cela aurait vraiment du sens. Je vais mettre ça au fait qu'il est tard, j'ai programmé pendant 6 heures non-stop et je n'ai pas eu une canette de Red Bull. Soit ça ou je ne suis pas si malin! Cheers mate. – woodstock

Questions connexes