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();
}
}
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.