Tworzenie okien

msm

Wstęp

Zdarzają się sytuacje gdy jedno okno nam nie wystarcza. Co możemy wtedy zrobić? Można stworzyć, powiedzmy, klasę typu "okno" przechowującą zmienne o właściwości wszystkich komponentów na formie i procedurę która "przemienia" je na te komponenty przy użyciu danych zmiennych (Wierzcie albo nie, udało mi się coś takiego zrobić dawno temu). Takie rozwiązanie ma jednak "parę" sporych wad. Jest: Skomplikowane, nieczytelne, wolne (przy większej ilości komponentów) i... nie rozwiązuje innego problemu - co zrobić gdy chcemy by dwa okna były widoczne na raz.

Światło w tunelu

Jednak i wtedy nie jesteśmy na straconej pozycji. Środowisko visual C# pozwala nam stworzyć nowe okno w bardzo prosty sposób.

Stwórzmy najpierw nowy projekt o nazwie Windows (liczba mnoga od "window", jakby co...) . Następnie kliknij prawym przyciskiem myszy na napisie "Windows" z menu "solution explorer" i wybierz add -> new form, albo (jeśli twoja wersja visual C# nie ma takiej opcji) add -> new item -> windows form i nazwij ją Form2.cs. W ten sposób stworzyliśmy nową formę.

Po uruchomieniu programu pojawi się jednak nowy zgrzyt - drugiej formy nie widać! Dzieje się tak dlatego że domyślnie widoczna jest tylko pierwsza forma. Poradzimy sobie z tym dodając następujący kod:

Form2 form2 = new Form2();
form2.Show();

Jeśli chcemy wyłączyć okno wystarczy wpisać:

form2.Close();

Przykład otwierania okna2 z poziomu okna1 oraz pobierania danych przez okno2 z okna1.

Na Form1 należy przeciągnąć:

  • textBox1
  • button1 (na przycisk dwa razy kliknąć aby zdefiniować zdarzenie click dla tego przycisku)

Następnie należy utworzyć Form2 i na nie przeciągnąć:

  • label1
    -button1 (na przycisk dwa razy kliknąć aby zdefiniować zdarzenie click dla tego przycisku, przycisk po naciśnięciu pobierze tekst z textBoxa z Form1

Kod w Form1:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public string TekstPobranyZTextBoxaZForm1()
        {
            return textBox1.Text;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 okienko = new Form2(this);
            okienko.Show();
        }
    }

kod w Form2.

    public partial class Form2 : Form
    {
        Form1 form;

        public Form2()
        {
            InitializeComponent();
        }

        public Form2(Form1 form)
        {
            InitializeComponent();
            this.form = form;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = form.TekstPobranyZTextBoxaZForm1();
        }
    }

1 komentarz

Chciałbym zdefiniować form1, aby ustawić mu na chwile właściwość Visable = false
Ale gdy wpisuje w programie:

Form1 form1 = new Form1();

i uruchamiam go wyskakuje mi błąd w Form2.desinger.cs wskazujący na:

this.ResumeLayout(false);
Mój cały program wygląda tak:

public partial class Form1 : Form
{
Form2 form2 = new Form2();
Form1 form1 = new Form1();
public Form1()
{
InitializeComponent();
}
}

W form 2 nic nie ma.