14.11.Komunikacija između formi
Kada radimo sa više formi, često je potrebno da prosleđujemo podatke između njih. Najčešći pristupi su:
a) Prosleđivanje podataka prilikom kreiranja forme (pomoću konstruktora)
U ovom slučaju se podaci prosleđuju kroz konstruktor nove forme:
public class Form2 : Form
{
private string data;
public Form2(string data)
{
InitializeComponent();
this.data = data;
}
}
U Form1 se instancira Form2 i proslede podaci:
Form2 form2 = new Form2("Neki podaci");
form2.Show();
- Kreirati projekat sa dve forme:
Form1(glavna forma) iForm2(druga forma).
- Na prvoj formi treba da je labela, textBox i jedno dugme, a na drugoj formi bar jedna labela za prikaz poslatih podataka.
- U
Form2:- dodati
LabelkontrolulblPodatak, koja će prikazivati prosleđeni podatak. - postaviti i svojstvo podatak u koje sa postavlja primenjeni podatak
- nakon toga, definisati konstruktor koji prima podatke
- prilikom učitavanja forme treba da se podatak prikazuje u labeli
- dodati
- U
Form1:- kada se klikne na dugme treba da se kreira konkretan primerak
Form2.
- Prrilikom kreiranja objekta proslediti podatke pomoću konstruktora.
- kada se klikne na dugme treba da se kreira konkretan primerak
Deo rešenja sa objašnjenjima je u nastavku:
1. Form1.cs (glavna forma)
Definisati glavnu formu koja će proslediti podatke prilikom otvaranja druge forme.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) { string podatak = textBox1.Text;
Form2 forma = new Form2(podatak);
forma.Show();
}
}
2. Form2.cs (druga forma)
Primiti podatke kroz konstruktor i prikazati ih u labeli.
U ovom primeru treba ostaviti konstruktor bez parametara (trebaće nam za sledeće primere) i dodati konstruktor sa jednim parametrom:
public partial class Form2 : Form
{
private string podatak;
public Form2(string data)
{
InitializeComponent();
this.podatak = data;
}
private void Form2_Load(object sender, EventArgs e)
{
lblPodatak.Text = podatak;
}
}
b) Korišćenje javnih metoda ili svojstava
Druga opcija je kreiranje javnih svojstava ili metoda u drugoj formi za postavljanje ili dobijanje podataka:
public class Form3 : Form
{
public string Data { get; set; }
}
Zatim u Form1:
Form3 form3 = new Form3();
form3.Data = "Neki podaci";
form3.Show();
U prethodni zadatak dodati deo u kojem se podaci prosleđuju javnih metoda. U ovom primeru, Form1 (glavna forma) će otvoriti Form3 (treća forma) i proslediti joj podatke koristeći javnu metodu definisanu u Form3.
Koraci po kojima se radi:
- Pošto već imamo kreirane forme:
Form1(glavna forma) iForm3(treća forma).- U
Form1, dodati dugme koje će, kada se klikne, otvoritiForm3. Dugme nazvetibuttonOpenForm3. - U
Form3, dodatiLabelkontrolulabelDataDisplay3, koja će prikazivati prosleđene podatke.
- U
- Definisati javnu metodu u
Form3koja prima podatke i ispisuje ih uLabel. Metodu nazvatiSetData. - Pozvati tu metodu iz
Form1kako bi se podaci prosledili uForm3.- Pozvati tu metodu iz
Form1pre nego što se prikažeForm3.
- Pozvati tu metodu iz
1. Form1.cs (glavna forma)
Dodati dugme na formu. Nazvati ga btnOtvoriForm2 i na klik da se postavi nova forma2 i da joj se pošalju podaci:
private void btnOtvoriForm3_Click(object sender, EventArgs e)
{
// Kreiraj instancu Form3
Form3 form3 = new Form3();
// Prosledi podatke u Form3 pomoću javne metode
form3.SetData("Pozdrav iz Form1");
// Prikaži Form3
form3.Show();
}
2. Form3.cs (druga forma)
Definisati javnu metodu koja će primati podatke iz Form1 i prikazati ih u Label kontroli. Metodu postaviti odmah nakon konstruktora. Pozvati je ili prilikom učitavanja forme3 ili klikom na neko dugme.
// Definiši javnu metodu za postavljanje podataka
public void SetData(string data)
{
// Prikaži prosleđeni podatak u Label kontroli
labelDataDisplay3.Text = data;
}
Objašnjenje:
Form3definiše javnu metoduSetDatakoja prima string podatak.Form1kreira instancuForm3, poziva metoduSetDatai prosleđuje podatke pre nego što prikažeForm3.
Zatadak: Proslediti podatke između formi pomoću javnih svojstava. U ovom delu, Form1 (glavna forma) će otvoriti Form4 (čevrta forma) i proslediti joj podatke koristeći javno svojstvo definisano u Form4.
Dizajn formi Form1 i Form4:
- U
Form1, dodati dugmebtnOpenForm4koje će otvoritiForm4kada se klikne. - U
Form4:- dodati
LabelkontrolulblDataDisplay, koja će prikazivati prosleđene podatke. - definisati javno svojstvo u
Form4koje će primati podatke.
- dodati
- Postaviti vrednost tog svojstva iz
Form1pre nego što prikažešForm4.
1. Form1.cs (glavna forma)
Dodati u formu dugme sa nazivom btnOpenForm4. Potrebno je postaviti podatke u svojstvo Form4 pre nego što se prikaže.
private void buttonOpenForm4_Click(object sender, EventArgs e)
{
// Kreiraj instancu Form4
Form4 form4 = new Form4();
// Postavi podatke koristeći javno svojstvo
form4.DataSvojstvo = "Pozdrav iz Form1";
// Prikaži Form4
form4.Show();
}
2. Form4.cs (druga forma)
Definisati javno svojstvo koje prima podatke iz Form1 i prikazuje ih u Label kontroli prilikom učitavanja forme4.
// Definiši javno svojstvo za primanje podataka
public string DataSvojstvo { get; set; }
// nakon svojstva su konstruktori
// Preuzmi podatak i prikaži ga prilikom učitavanja forme
private void Form4_Load(object sender, EventArgs e)
{
// Prikaži prosleđeni podatak u Label kontroli
lblDataDisplay.Text = Data;
}
Objašnjenje:
Form4definiše javno svojstvoDatakoje prima string vrednost.- U
Form1, pre nego što seForm4prikaže, postavlja se vrednost tog svojstva. - Kada se
Form4učita (Form_Loaddogađaj), vrednost svojstvaDataSvojstvose prikazuje uLabelkontroli.
c) Povratak podataka iz forme
Ako se koristi modalna forma (ShowDialog()), podaci se mogu vratiti prilikom zatvaranja forme:
U tom slučaju treba da se u Form5 kreira javno svojstvo za podatke koje treba vratiti:
public string ReturnedData { get; set; }
private void buttonClose_Click(object sender, EventArgs e)
{
this.ReturnedData = "Povratni podaci";
this.DialogResult = DialogResult.OK; // Zatvara formu
this.Close();
}
U Form1:
Form5 form5 = new Form5();
if (form5.ShowDialog() == DialogResult.OK)
{
string povratniPodaci = form4.ReturnedData;
// Koristi povratne podatke
}
d) Event-driven komunikacija
Forma može emitovati događaj koji druga forma može osluškivati. Na ovaj način, može da se pošalje obaveštenje u glavnu formu o promenama u drugoj formi.
Na primer, u Form6 može da se kreira događaj:
public event EventHandler DataUpdated;
private void buttonUpdate_Click(object sender, EventArgs e)
{
DataUpdated?.Invoke(this, EventArgs.Empty);
}
Zatim u Form1 može da se pretplati na događaj:
Form6 form6 = new Form6();
form6.DataUpdated += (sender, args) =>
{
// Ovaj kod se izvršava kada se događaj okine u Form2
MessageBox.Show("Podaci su ažurirani!");
};
form6.Show();
Ovaj način je koristan kada je potrebno obavestiti glavnu formu da je neka akcija izvršena na drugoj formi.
Vežba 3: Kreirati primer komunikacije između dve forme koristeći event-driven pristup, gde Form2 obaveštava Form1 da su podaci ažurirani.
Koraci:
- Kreirati dve forme:
Form1(glavna forma) iForm2(druga forma). - U
Form2kreirati događaj koji će se emitovati kada se ažuriraju podaci. Form1će slušati taj događaj i reagovati na ažuriranje.
Programski kod:
1. Form1.cs (glavna forma)
Ovo je forma koja će otvoriti Form2 i slušati njen događaj.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonOpenForm2_Click(object sender, EventArgs e)
{
// Kreiramo instancu Form2
Form2 form2 = new Form2();
// Pretplaćujemo se na događaj DataUpdated iz Form2
form2.DataUpdated += Form2_DataUpdated;
// Otvaramo Form2
form2.Show();
}
// Ova metoda se poziva kada Form2 emituje događaj
private void Form2_DataUpdated(object sender, EventArgs e)
{
// Ovdje reagujemo na događaj
MessageBox.Show("Podaci u Form2 su ažurirani!");
}
}
2. Form2.cs (druga forma)
Ovo je forma koja će emitovati događaj kada podaci budu ažurirani, npr. klikom na dugme.
public partial class Form2 : Form
{
// Definisati događaj koji će slati obaveštenje
public event EventHandler DataUpdated;
public Form2()
{
InitializeComponent();
}
private void buttonUpdateData_Click(object sender, EventArgs e)
{
// Emitovati događaj kada se dugme klikne
DataUpdated?.Invoke(this, EventArgs.Empty);
}
}
Objašnjenje:
- U
Form2je definisan događajDataUpdated, koji će biti emitovan kad korisnik klikne na dugme (npr. kada ažurira podatke). - U
Form1, pretplaćuje se na taj događaj tako što se koristiform2.DataUpdated += Form2_DataUpdated. Kada se događaj pokrene, izvršava se metodaForm2_DataUpdated, gde se prikazuje poruku o ažuriranju podataka.
Koraci za testiranje:
- Kreiraj obe Windows Forme i dodati dugme u obe forme.
- U
Form1, dugme će otvaratiForm2. - U
Form2, dugme će emitovati događaj koji obaveštavaForm1da su podaci ažurirani.
Da ponovimo koji su koraci:
- Kreirati više formi koristeći Visual Studio.
- Koristiti
Show()iliShowDialog()za otvaranje formi. - Komunikacija se može vršiti kroz konstruktore, javna svojstva/metode ili događaje.