Ако је неопходно да наш пројекат има више форми, само креирање додатних форми је прилично једноставно. Кликом на Add Form (Windows Forms) у менију Project, добијамо опцију да додамо још једну форму у наш пројекат, на пример Form2.
Међутим, сам рад са више форми и није јако једноставан.
Претпоставимо да смо креирали додатну форму, па сада у нашем пројекту имамо Form1 и Form2. На Form1 налази се дугме “Prikaži Form2”.
Да би кликом на то дугме приказали другу форму, неопходно је да креирамо инстанцу Form2 објектa и задамо команду за приказ.
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
}
Сада се кликом на дугме приказује Form2, али постоји један баг. Ако корисник настави да кликће на дугме, креираће много инстанци Form2 објеката.
Овај проблем можемо решити измештањем линије у којој креирамо инстанцу Form2 објекта из дате методе.
Form2 f2 = new Form2();
private void button1_Click(object sender, EventArgs e)
{
f2.Show();
}
Један баг смо отклонили, али смо створили други. Сада корисник може да кликће колико год жели на дугме “Prikaži Form2”, али тиме неће креирати додатне инстанце Form2 објеката. Проблем настаје када једном прикаже Form2, затвори Form2, па након тога поново кликне на дугме за приказ Form2 што проузрокује следећу грешку:
Како решити овај проблем? Кликом на дугме за приказ друге форме креирамо нову инстанцу Form2 објекта, сакривамо прву форму и приказујемо другу, тако да корисник не може да настави да кликће на думе “Prikaži Form2”. Креирамо и догађај који ће нам јавити када је друга форма затворена и тада поново приказујемо прву форму.
void f2zatvorena(object sender, FormClosedEventArgs e)
{
this.Visible = true;
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.FormClosed += new FormClosedEventHandler(f2zatvorena);
this.Visible = false;
f2.Show();
}
Modal Forms
Једноставније решење је да другу форму третирамо као дијалог. На првој форми преправићемо методу за клик на дугме “Prikaži Form2” на следећи начин:
Form2 f2 = new Form2();
private void button1_Click(object sender, EventArgs e)
{
f2.ShowDialog();
}
Сада, када корисник кликне једном на дугме “Prikaži Form2”, не може да настави да кликће поново на то дугме све док не затвори другу форму.
Како је друга форма приказана у форми дијалога, то можемо додатно искористити да видимо шта је корисник кликнуо на њој. На пример, поставимо два дугмета на другој форми: OK и Cancel.
Напишимо методе за клик дугме ОК и дугме Cancel:
private void button1_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
private void button2_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
Ако преправимо код на првој форми, можемо видети шта је корисник притиснуо на другој форми:
Form2 f2 = new Form2();
private void button1_Click(object sender, EventArgs e)
{
if (f2.ShowDialog() == DialogResult.OK)
MessageBox.Show("Korisnik je kliknuo dugme OK");
else
MessageBox.Show("Korisnik je kliknuo dugme Cancel");
}
Можете приметити и да је клик на дугме Cancel једнак клику на дугме Close u насловној линији друге форме.
Модалне форме можемо искористити и за прослеђивање вредности. Проблем са прослеђивањем вредности је што су вредности на једној форми приватне и невидљиве на другој. Овај проблем решава се са public static променљивама.
На пример, на првој форми имамо дугме “Odaberi vrednost”, а на другој радио дугмад. Кликом на дугме “Odaberi vrednost” корисник одабира неку од вредности помоћу радио дугмади на другој форми, па то што је одабрао приказује се у лабели на првој форми.
Изглед форми:
Код за Form1
using System;
using System.Drawing;
using System.Windows.Forms;
namespace RadSaViseFormi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Form2 f2 = new Form2();
public static Label labela = new Label();
private void button1_Click(object sender, EventArgs e)
{
f2.ShowDialog();
}
private void Form1_Load(object sender, EventArgs e)
{
labela.Location = new Point(10, 10);
this.Controls.Add(labela);
}
}
}
Код за Form2
using System;
using System.Windows.Forms;
namespace RadSaViseFormi
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string opcije = Form1.labela.Text;
if (radioButton1.Checked == true)
opcije = "Opcija 1";
else if (radioButton2.Checked == true)
opcije = "Opcija 2";
Form1.labela.Text = opcije;
this.DialogResult = DialogResult.OK;
}
private void button2_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}
}