Laden...

MDI-Child in den Vordergrund

Letzter Beitrag vor 17 Jahren 16 Posts 7.555 Views
MDI-Child in den Vordergrund

Hallo,
ich wollte in meinem Programm um Stammdaten in eine DB zu erfassen, dass die entsprechenden Forms, die MDI-Childs von meiner "MainForm" sind, nur einmal geöffnet werden. Das funktioniert auch soweit. Jetzt wollte ich aber, dass wenn das Fenster schon aufgerufen wurde, dieses in den Vordergrund setzen. Mein Code dazu sieht folgendermaßen aus:


        public void FormShow(Form form)
        {
            if (FormStatus.getStatus(form.Text)) //liefert "true" wenn nicht aufgerufen
            {
                FormStatus.setStatus(form.Text); //getStatus würde jetzt "false" liefern
                form.MdiParent = this;
                form.Show();
                FormCount.addForm(); 
            }
            else
            {
                //TO DO: form.BringToFront();  ?!? geht nicht
            }
         }

Visit my Blog: http://michael.barz.de

Hallo barzelona,

geht es damit?


form.Visible = true;

Gruß falangkinjau

hi,

probier mal im MDI-child nach InitializeComponent();


this.TopLevel = true;

vielleicht hilfts ja ?

lg

ich werds gleich mal ausprobieren...

Visit my Blog: http://michael.barz.de

Hat leider beides nicht funktioniert:

form.Visible = true; 

das hat eine neue Instanz auserhalb der MainForm erstellt und

this.TopLevel = true; 

unter InitializeComponent() kann ichs nicht starten, weil der Code ja vom Button_click Ereignis in der MainForm ausgelöst wird. Das würde, wenn es unter InitializeComponent() überhaupt was bring, nur funktionieren, wenn ich InitializeComponent() aufrufen kann und das geht nicht nach meinem Wissen.

Visit my Blog: http://michael.barz.de

okay, wie wärs mit:

im Parent:


form.GoToTop();

im MDI child:


public void GoToTop()
{
     this.WindowState = FormWindowState.Maximized;
}

Hallo

Es ist möglich dass ich das Thema etwas missverstanden habe.
Aber ein MDI-Child kannst du mit form.Activate() nach vorne holen und fokusieren.

Gruss Fellmer

@ nin: das geht auch nicht,
ich rufe ja

FormShow(form);

auf und ich kann nicht für einen mitgelieferten Parameter eine Methode aufrufen, die ich in der Form erstellt habe.
Das würde nur gehn wenn man die Form dort aufruft, wo man sie definiert. Also das geht nur wenns so aussehen würde:


SubForm subForm = new SubForm();
subForm.Parent = this;
if (nochNichtAufgerufe())
{
   subForm.Show();
}
else
{
   subForm.GoToTop();
}

bei mir sieht es so aus:


SubForm subForm = new SubForm();
subForm.Parent = this;
this.FormShow(subForm);  //Methode siehe oben

Visit my Blog: http://michael.barz.de

Aber ein MDI-Child kannst du mit form.Activate() nach vorne holen und fokusieren.

sollte, geht aber nicht. Das war das erste was ich ausprobiert hab.

Visit my Blog: http://michael.barz.de

Hallo barzelona,
Stop!

Was ist den oben in deinem Code das MDI-Child?

Weil, einmal sagst du


form.MdiParent = this;  // Hier ist form MDI-Parent und this das MDI-Child. Ist this das MDI-Child

und dann weiter unten, aber auskommentiert


form.BringToFront //Hier wolltest du das Hauptfenster? - MDI-Parent? in den Vordergrund bringen. Ist es aber wahrscheinlich schon.

Da stimmt was nicht. Da sollten wir erstmal klären.

Gruß falangkinjau

ich hab grad was gefunden, was mehr oder weniger funktioniert:


private void ShowWindow(int nIndex)
{
this.MdiChildren[nIndex].BringToFront();
} 

jetzt hab ich nur noch das problem, dass ich nicht weiß, wie ich rausfinde welchen Index mein gewünschtes MDI Child hat...

Visit my Blog: http://michael.barz.de

@ falangkinjau:


form.MdiParent = this; 

Das legt fest, dass "this" der Mdi-Parent von "form" ist!

Visit my Blog: http://michael.barz.de

Hallo barzelona,

o.k. ich habe es verstanden.

Nutze doch die Form.Tag Eigenschaft für deinen Index.

Gruß falangkinjau

Also ich bin mir nicht sicher wie du das mit form.Tag meinst. Vielleicht kannst du ma ein Code-Beispiel einsetzen. Ich hab im mom nämlich keinen Plan. Also Tag als Lieferant für den Index, das ist schon klar, aber wie verwende ich den Tag?

ich habs mal so gedeutet und Versucht, aber das ging nicht:


this.MdiChildren[form.Tag].BringToFront();

//oder

this.MdiChildren[form.Tag.GetHashCode()].BringToFront();

bei der 2. Variante kompiliert er zwar, jedoch wird eine Exception ausgeworfen.
Dann hab ich einen Try/Catch Block darumgesetzt:

Fehler: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt"

Visit my Blog: http://michael.barz.de

wenn du dieses eine spezielle MDI-child erstellst, schreibt du z. Bsp.


form.Tag = (string)"Das ist mein Control, dass ich suche";

später findest du es so:


foreach (Form frm in this.MdiChildren)
{
    if (frm.Tag.ToString() == "Das ist mein Control, dass ich suche")
       frm.BringToFront();
}

Danke nin, so hats jetzt funktioniert!

für alle die später kommen hier hab ich mein Code-Beispiel:


        public void FormShow(Form form)
        {
            if (FormStatus.getStatus(form.Text))
            {
                FormStatus.setStatus(form.Text);
                form.MdiParent = this;
                form.Tag = (string)form.Text;
                form.Show();
                FormCount.addForm();
            }
            else
            {
                foreach (Form mdiForm in this.MdiChildren)
                {
                    if (mdiForm.Tag.ToString() == form.Text)
                    {
                        mdiForm.BringToFront();
                    }
                }
            }
        }

das ganze ruft man dann mit folgendem Code auf:


SubForm subForm = new SubForm();
this.FormShow(subForm);

Visit my Blog: http://michael.barz.de