fomularze MDI

0

Mam: Form1- menu główne
Form2- program
Form3-ustawienia

Form1:
private void button1_Click(object sender, EventArgs e)
{
Form1 Form1 = new Form1();
Nauka Form2= new Nauka();
Form2.MdiParent = this;
button1.Visible = false;
button2.Visible = false;
button3.Visible = false;
button4.Visible = false;
button5.Visible = false;
Form2.Show();
}

I tu mam problem:

  1. Chcę otworzyć z formy2 forme3

     private void button4_Click(object sender, EventArgs e)
     {
         Close();     //zamykam forme2 aby dostac sie do rodzica
         Form1 Form1 = new Form1();
         Ustawienia Form3 = new Ustawienia();
         Form3.MdiParent = this;
         Form3.Show();
     }
    

    Jednak wyskakuje mi błąd przy Form3.MdiParent = this; :
    ArgumentException was unhandled
    Form that was specified to be the MdiParent for this form is not an MdiContainer.
    Parameter name: value

    Czy chodzi aby dodać Form1.IsMdiContainer = true; jedank dalej nie zadziałało. Zabardzo ie wiem o co chodzi.

  2. Jeżeli ustaiwę w formie1 MdiConttainer = true to wtedy mam wszystkie przyciski przenoszone do nastepnych form. Ogólnie wyłączyłem je:
    button1.Visible = false;
    button2.Visible = false;
    button3.Visible = false;
    button4.Visible = false;
    button5.Visible = false;
    Jednak ja później wracam do formy1 to nie wiem jak zrobić aby samo otwarcie formy ustawiło mi Visible wszystkich przycisków na true.

Proszę o pomoc :d

0

Chyba trochę mało czytelnie to opisałem :-D
Mam przyciski w formularzu Form1(który jest rodzicem).
Gdy wchodzę do Form2(dziecko) te przyciski są nadal widoczne.
Próbowałem je jakoś wyłączyć np.
public Form2()
{
InitializeComponent();

        Form1 Form1 = new Form1();
        Form1.button1.Visible = false;
        Form1.button2.Visible = false;
        
    }

To jednak nie działa!!!!

Ja zrobić aby w dziecku przyciski te nie były widoczne a po powrocie do rodzica były.
Prawdopodobnie zadaje bardzo proste pytanie ale ja jakoś utknąłem nad tym i nie wiem co robić [glowa]

0

gdzies pamietam odpowiedz troche pokretna, ktora brzmiala:
nie umieszczaj na mdi kontenerze, zadnych przyciskow, przynajmiej nie w obszarze, gdzie wyswietlane sa okna dzieci. obszar ten powinien byc przeznaczony tylko i wylacznie dla okien dzieci, a ewentualne kontrolki na oknie rodzicu powinny byc wyswietlana ew. na toolstripie lub podobnym.

pozdrawiam
Mariusz

ps. tu masz przyklad http://www.mariuszzaleski.com/es.en.aspx
wszystkie dialogi sa dziecmi mdi kontenera a kontrolki na rodzicu sa umieszczone w toolstripie.

0

Dzięki aristo za odpowiedź. Masz rację że jeśli umieści się przyciski w polu kontenera to później są one przekazywane do dzieci. postanowiłem obejść to w bardzie drastyczny sposób. Poniżej zamieszcze kod może się przyda innym:
użyłem timera w form1 aby co 300ms sprawdzał mi czy czy dziecko zostało zamknięte (jeśli ktoś ma lepszy pomysł proszę pisać :-) )

Form1:
public Form1()
{
InitializeComponent();

        timer1 = new System.Windows.Forms.Timer();
        timer1.Interval = 300;
        timer1.Tick += new EventHandler(timer1_tick);
        timer1.Start();
    }

    private void timer1_tick(object sender, EventArgs e)
    {
        if (Form2.wyswietlenie_menu_glownego==true)
        {
            button1.Visible = true;
            button3.Visible = true;
        }
    }

Jak wchodzę do dziecka to dopisuję następujący kod:
Form2.wyswietlenie_menu_glownego = false;
button1.Visible = false;
button3.Visible = false;

Podczas zamykania Form2:
private void button1_Click_2(object sender, EventArgs e)
{
wyswietlenie_menu_glownego = true;
Close();
}

Ta metoda z timerem bez sensu obciąża cpu i marnuje pamieć ale ogólnie nie wymysliłem nic lepszego. Jeśli ktoś ma lepszy pomysł prosze pisać ;-)

0

daj te przyciski na panel, obsłuż otwieranie i zamykanie okien MDIChild i jak jest ich 0 to pokazuj panel a jak więcej niż 0 to chowaj

0

Zastosowanie panelu mi nic nie dało. Problem jest w tym, że będąc w MDIChild mimo że zadeklarowałem panel czy przycisk jako public, mam dostęp do tego panelu jednak np. Form1.panel1.Visible = true; nie powoduje, że panel sie pojawi. Jedynie operacje mogę robić na panelu z poziomu rodzica. Dziwne to dla mnie , może coś zamieszałem w kodzie że mi to nie działa. Dopiero zaczynam zabawę w .net więc wiele kwestji jest dla mnie niezrozumiała ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1