2009-07-03 2 views
0

Dies ist eine WinForm-Anwendungsfrage in .net. Es handelt sich um MDI-Form.Warum MDI-Elternform das Z indice von untergeordneten Formularen zurücksetzen, wenn es fokussiert ist?

Ich habe ein MDI-Formular (ParentForm), in dem ich viele Instanzformen von ChildForm erstellen kann. Ich erstelle zwei ChildForm, benannt, cf1 und cf2 nacheinander. Also wird cf1 einen Z-Index niedriger als cf2 haben und cf2 wird über cf1 stehen.

Dann wechsle ich zu einem anderen Formular, was bedeutet, dass ParentForm seinen Fokus in Windows verliert. Dann wechsle ich zurück zu ParentForm. Wenn dies geschieht, setzt ParentForm automatisch cf1 immer auf cf2.

Das passiert auch, wenn ich drei Instanzen von ChildForm habe. ParentForm legt die zuerst erstellte Instanz immer zuerst nach oben, wenn ich zu ParentForm zurückwechsle.

Jetzt ist die interessante Sache, es passiert natürlich nur für ChildForm (wenn es für jedes Kindformular der Fall ist, wird das ein Fehler von .net sein). Ich denke, dass etwas in meiner ChildForm falsch ist, das das auslöst, aber ich habe keine Ahnung, was das ist. Es gibt kein onActive-Ereignis für ChildForm und ParentForm.

Die Instanzen von Child erstellt werden direkt in Parent, Codebeispiel ist:

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

Jeder mit diesem vor begrüßt kam über mich auf ein paar Hinweise zu geben, was schief geht possibliy könnte.

Antwort

0

Dies kann eine sehr schwer zu beantwortende Frage sein, da die Frage selbst zu vage ist. Lassen Sie mich etwas zu dem sagen, was ich zu diesem Problem gefunden habe.

Das Formular enthält eine Listenansicht mit Datenbindung. Die Änderung der Datenbindung wird eine Änderung an einem Registersteuerelement auslösen. Je nachdem, welches Element in der Listenansicht ausgewählt ist, werden auf dem Register einige Registerkarten angezeigt. Die angezeigten Registerkarten unterscheiden sich je nach den in der Listenansicht ausgewählten Arten von Elementen.

Wie wir alle wissen, gibt es keine Möglichkeit, einige Registerkarten auf dem Registerkarten-Steuerelement auszublenden oder anzuzeigen. Die einzige Möglichkeit, einen ähnlichen Effekt zu erzielen, besteht darin, die Registerkarten im Registerkarten-Steuerelement zu löschen und Registerkarten hinzuzufügen.

Es scheint, dass diese Beziehung auslöst, dass das Formular unerwartet aktiviert wird. Wenn sich der Fokus des übergeordneten MDI-Formulars ändert, werden die untergeordneten Formulare in der Reihenfolge neu gezeichnet, und wenn das Formular erneut gezeichnet wird, werden die Änderungen am Registersteuerelement aktualisiert und ausgelöst, und das Formular wird aktiviert. Ich habe die Kette von all diesen nicht vollständig erforscht, da sie tief in den Rahmen selbst gehen können. Das Debuggen hilft überhaupt nicht, da der Aktivierungsteil nur zu externem Code führt, in den ich nicht debuggen kann. Das Setzen von Haltepunkten auf den Code zum Entfernen und Hinzufügen von Registerkarten funktioniert nicht so gut. Der Breakpoint wird nie getroffen, aber es ist ziemlich sicher, dass der umgebende Code den Unterschied macht. Dies ist ein Teil, den ich immer noch verwirre. Warum der Breakpoint nie getroffen wird, aber das Kommentieren des umgebenden Codes tatsächlich einen Unterschied macht. Ich werde mich sehr freuen, wenn mir jemand die Verwirrung erklären kann.

Jetzt meine Lösung. Ich gehe zu dem Code, der die Registerkarten entfernt und hinzufügt. Anstatt jedes Mal Tabs zu entfernen und hinzuzufügen, speichere ich die Tabs, die zum Gehen führen, in einer Sammlung und vergleiche diese Sammlung mit den Tab-Einstellungen der aktuellen Registerkarte. Wenn sie gleich sind, ist keine Änderung erforderlich.Wenn sie nicht identisch sind, wird die Registerkarte gelöscht und erneut ausgeführt. In meinem problematischen Fall sollten die Registerkarten nie aktualisiert werden, so dass die Tab-Seite nicht gelöscht und neu hinzugefügt werden muss. Erstaunlicherweise löst diese Änderung mein Problem.

Obwohl ich glaube, dass meine Art, das Problem zu beheben, nicht oberflächlich ist, habe ich es versäumt, die ganze Geschichte auszugraben. Wenn jemand, nachdem er meine Geschichte gehört hat, irgendeine Idee von der ganzen Geschichte hat und irgendeinen Vorschlag für eine bessere Lösung hat, werde ich sehr, sehr glücklich sein, ihm zuzuhören.

Vielen Dank.

0

In einigen Fällen kann dies passieren, wenn der Fokus auf einem deaktivierten Steuerelement des Formulars liegt. Ich weiß nicht, ob dies der Fall ist, aber alle Fokusprobleme können mit einem MenüStrip/ToolStrip gelöst werden, der den Fokus hat. Mehr nach dem Link: MSDN forums

Verwandte Themen