2009-07-03 3 views
0

Il s'agit d'une question d'application WinForm dans .net. Il s'agit de la forme MDI.Pourquoi la forme parent MDI a-t-elle réinitialisé l'indice Z des formes enfants lorsqu'elle est focalisée?

J'ai un formulaire MDI (ParentForm), dans lequel je peux créer plusieurs formulaires d'instance de ChildForm. Je crée deux ChildForm, nommés, cf1 et cf2 un par un. Ainsi, cf1 aura un indice Z inférieur à cf2 et cf2 sera au-dessus de cf1.

Puis je passer à une autre forme, ce qui signifie que ParentForm perd son focus dans Windows. Puis je retourne à ParentForm. Lorsque cela se produit, ParentForm place automatiquement cf1 au-dessus de cf2.

Cela se produit également si j'ai trois instances de ChildForm. ParentForm place toujours l'instance créée en premier lorsque je retourne à ParentForm.

Maintenant, la chose intéressante est, il arrive seulement pour ChildForm bien sûr (si c'est le cas pour toute forme enfant, ce sera un bug de .net). Je pense qu'il y a quelque chose qui cloche dans mon ChildForm qui déclenche cela mais je n'ai aucune idée de ce que c'est. Il n'y a pas d'événement onActive pour ChildForm et ParentForm.

Les instances de ChildForm sont créés directement dans ParentForm, exemple de code est:

ParentForm_CreateChildForm(){ 
    var cf = new ChildForm(); 
    cf.MdiParent = this; 
    cf.Show(); 
} 

Tout le monde est tombé sur cette avant est la bienvenue pour me donner quelques conseils sur ce qui pourrait possibliy va mal.

Répondre

0

Cela peut être une question très difficile à répondre puisque la question elle-même est trop vague. Laissez-moi dire quelque chose sur ce que j'ai trouvé lié à ce problème.

Le formulaire contient une vue de liste avec sa liaison de données. La modification de la liaison de données déclenchera la modification d'un contrôle onglet. En fonction de l'élément sélectionné dans la liste, le contrôle onglet affiche des pages à onglet. Les pages à onglet à afficher diffèrent en fonction des différents types d'éléments sélectionnés dans la vue en liste.

Comme nous le savons tous, il n'y a aucun moyen de masquer ou d'afficher certaines pages d'onglets sur le contrôle onglet. La seule façon d'obtenir un effet similaire est d'effacer les pages à onglets du contrôle onglet et d'y ajouter les pages à onglet.

Il semble que cette relation déclenche l'activation inattendue du formulaire. Lorsque les focus du formulaire parent MDI changent, les formulaires enfant se repeignent eux-mêmes dans l'ordre et lorsque le formulaire repeint, la liaison de données est mise à jour et déclenche les modifications apportées au contrôle onglet et activer le formulaire. Je n'ai pas complètement exploré la chaîne de tout cela puisqu'ils peuvent aller jusqu'au cadre. Le débogage n'aide pas du tout puisque la partie activation ne conduit qu'au code externe que je ne peux pas déboguer. La définition de points d'arrêt au code de suppression et d'ajout de pages à onglet ne fonctionne pas également. Le point de rupture n'est jamais atteint mais il est presque certain que le code environnant fait la différence. C'est une partie que je confonds encore. Pourquoi le point de rupture n'est jamais atteint, mais commenter le code environnant fait réellement la différence. Je serai très heureux si quelqu'un peut m'expliquer la confusion.

Maintenant ma solution. Je vais au code qui supprime et ajoute les pages à onglet. Au lieu de supprimer et d'ajouter des pages à onglets à chaque fois, j'enregistre les pages d'onglets going-to-show dans une collection et compare cette collection avec le paramètre de page d'onglet du contrôle onglet. Si elles sont identiques, aucun changement n'est nécessaire.Si elles ne sont pas les mêmes, la page d'onglet efface et rajoute execute. Dans mon cas problématique, les pages à onglets ne devraient jamais avoir besoin d'être mises à jour pour que la page d'onglet disparaisse et que l'ajout ne soit jamais nécessaire. Étonnamment, ce changement résout mon problème.

Bien que je crois que ma façon de résoudre le problème n'est pas superficielle, j'ai échoué à creuser toute l'histoire. Si quelqu'un, après avoir entendu mon histoire, a une idée de toute l'histoire et suggère une meilleure solution, je serai très heureux de l'écouter.

Merci.

0

Dans certains cas, cela peut se produire si l'accent est mis sur un contrôle désactivé du formulaire. Je ne sais pas si c'est votre cas, mais tous les problèmes de focus peuvent être résolus avec l'utilisation d'un MenuStrip/ToolStrip qui prend l'accent. Plus après le lien: MSDN forums

Questions connexes