Kako otvoriti drugi iz jednog obrasca. Dodavanje obrazaca. Interakcija između oblika. Primjer konstruiranja i programskog pozivanja forme

Vjerojatnije je da će se pitanje o kojem se govori u ovom članku odnositi na temu izgradnje arhitekture aplikacije, a ne konkretno na problem koji se razmatra. Prijenos podataka iz jednog obrasca u drugi uopće nije težak. Za to je dovoljno kontrolu čije podatke želimo dobiti otvoriti, odnosno označiti je modifikatorom public. Također, moguća je i druga opcija. Na primjer, u prvoj formi kreiramo objekt druge forme prosljeđivanjem reference na sebe konstruktoru, odnosno prosljeđivanjem reference na prvu iz prve forme u drugu
Drugi obrazac drugi obrazac = novi drugi obrazac(ovo);
Naravno, prije nego što to učinite, trebali biste se pobrinuti za stvaranje preopterećenja za konstruktor drugog oblika.

I ova metoda je prilično česta. Međutim, svojom jednostavnošću nosi mnoge potencijalne probleme, od kojih je glavni kršenje načela enkapsulacije. Jednom riječju, drugi oblik ne bi smio znati ništa o postojanju prvoga, štoviše, ne bi smio na njega utjecati.

Rješenje ovog problema je prilično jednostavno. Pogledajmo izravno kod. Stvaramo u dizajneru glavni oblik(pokrenut će se kada se aplikacija pokrene). Stavimo jednu TextBox, Označiti I Dugme.

Klikom na gumb otvara se drugi obrazac i tekst iz polje za tekst glavni obrazac će biti prebačen u tekstualno polje drugog obrasca. U početku, drugi obrazac izgleda ovako:

Slično kao i prvi, ima iste kontrole. Ne treba nam više. Ulazna točka aplikacije pokreće glavni obrazac:

Korištenje sustava; koristeći System.Collections.Generic; koristeći System.Linq; koristeći System.Windows.Forms; namespace From1FormTo2 ( statička klasa Program ( // Glavna ulazna točka za aplikaciju. static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); ) ) )

Glavni kod obrasca izgleda ovako:

Korištenje sustava; koristeći System.Collections.Generic; using System.ComponentModel; koristeći System.Data; koristeći System.Drawing; koristeći System.Linq; koristeći System.Text; koristeći System.Windows.Forms; namespace From1FormTo2 ( javna djelomična klasa MainForm: Forma ( //druga forma SecondForm secondForm; //konstruktor public MainForm() ( InitializeComponent(); ) //rukovatelj događaja prijenosa podataka //od glavne forme do druge privatne void btn_mainForm_Click(object pošiljatelj, EventArgs e) ( secondForm = new SecondForm(tb_mainForm.Text.Trim()); secondForm.ShowDialog(); if (secondForm.DialogResult == DialogResult.OK) tb_mainForm.Text = secondForm.ReturnData(); ) ) )

U skladu s tim, ne zaboravite povezati gumb s događajem Klik. Ovdje u klasi glavnog obrasca postoji polje Drugi obrazac drugi obrazac, koji predstavlja objekt drugog oblika. Kada kliknete na gumb "Pošalji", kreira se drugi obrazac (poziva se preopterećeni konstruktor, kreirat ćemo ga kasnije) i pokreće se metodom Prikaži dijaloški okvir (). U ovom slučaju, ova metoda je prikladna za nas. Štoviše, nakon ovoga svakako provjeravamo je li drugi obrazac zatvoren, ali smo kliknuli na njegov gumb. Ako je gumb kliknut na drugom obrascu, tada bi prvi obrazac trebao prihvatiti podatke iz drugog. To se događa pozivanjem metode VratiPodatke() u drugom obliku.

Sada je najzanimljiviji dio kod drugog oblika:

Korištenje sustava; koristeći System.Collections.Generic; using System.ComponentModel; koristeći System.Data; koristeći System.Drawing; koristeći System.Linq; koristeći System.Text; koristeći System.Windows.Forms; prostor imena From1FormTo2 ( javna djelomična klasa SecondForm: Forma ( //preopterećeni konstruktor public SecondForm(string data) ( InitializeComponent(); tb_secondForm.Text = data; ) //rukovatelj događaja prijenosa podataka //od druge forme do glavne privatne void btn_secondForm_Click (pošiljatelj objekta, EventArgs e) ( this.DialogResult = DialogResult.OK; ) // javna metoda za pristup // tekstualnom polju ovog obrasca javni niz ReturnData() ( return (tb_secondForm.Text.Trim()); ) ) )

Kao što vidite, postoji jedno preopterećenje konstruktora koje prihvaća tip niza. Zapamtite da pokušavamo prenijeti tekst iz TextBoxa. U konstruktoru je planirano inicijaliziranje komponenti, a tekst tekstualnog polja postavljen je na prenesenu vrijednost iz prvog obrasca. Dalje, pretplatom na događaj Klik za gumb drugog obrasca stvorili smo rukovatelj btn_secondForm_Click, koji simulira rad gumba "Ok" bilo kojeg dijaloškog okvira. Dakle, klikom na gumb "Pošalji" (drugog obrasca) izvršavamo uvjet

(secondForm .DialogResult == DialogResult .OK)

Prvi oblik, dakle, pozivanje metode secondForm.ReturnData(), tekstualno polje prve forme postavljamo na vrijednost tekstualnog polja druge forme.

Posao ovu metodu, mislim, više ne zahtijeva objašnjenje. Jednostavno vraća tekst iz jednog tekstualnog polja, a pritom ga zadržava privatno.

Kao rezultat toga, prenijeli smo podatke u drugi obrazac iz prvog i iz drugog u prvi bez kršenja načela enkapsulacije.

Pokušajte unijeti tekst “aaa” u tekstno polje prvog obrasca i kliknite gumb. Vidjet ćete ovaj tekst u tekstualnom polju u drugom obrascu koji se otvori. Pokušajte promijeniti tekst u "aaa ppp" i kliknite na gumb. Vidjet ćete kako će se nakon zatvaranja drugog obrasca ovaj tekst pojaviti u tekstualnom polju glavnog obrasca.

Sada, mislim da ćete moći ispravnije prenositi podatke između obrazaca. U sljedećem članku ćemo govoriti o tome kako to učiniti u ASP.NET aplikacijama.

Zadnja izmjena: 31.10.2015

Da biste projektu dodali još jedan obrazac, desnom tipkom miša kliknite naziv projekta u prozoru Solution Explorer i odaberite Dodaj->Windows obrazac...

Dajmo novom obliku neko ime, na primjer, Form2.cs:

Stoga smo našem projektu dodali drugi obrazac. Pokušajmo sada implementirati interakciju između dva oblika. Recimo da će prvi obrazac pozvati drugi obrazac kada se pritisne gumb. Prvo, dodajmo gumb u prvi obrazac, Form1, i dvaput kliknimo na gumb da bismo otišli na kodnu datoteku. Dakle, doći ćemo do rukovatelja događajem klika gumba, koji se stvara prema zadanim postavkama nakon dvostrukog klika na gumb:

Privatni void button1_Click(object sender, EventArgs e) ( )

Sada mu dodajmo kod za pozivanje drugog obrasca. Naš drugi oblik se zove Form2, tako da prvo kreiramo objekt ove klase, a zatim da ga prikažemo na ekranu pozivamo metodu Show:

Privatni void button1_Click(object sender, EventArgs e) ( Form2 newForm = new Form2(); newForm.Show(); )

Sada učinimo suprotno - tako da drugi oblik utječe na prvi. Dok drugi oblik ne zna za postojanje prvog. Da biste to popravili, morate nekako prenijeti informacije o prvom obrascu u drugi obrazac. Da bismo to učinili, koristit ćemo prosljeđivanje veze na formu u konstruktoru.

Dakle, prijeđimo na drugi obrazac i idimo na njegov kod - desnom tipkom miša kliknite obrazac i odaberite Pregled koda. Za sada je prazan i sadrži samo konstruktor. Budući da C# podržava preopterećenje metoda, možemo stvoriti nekoliko metoda i konstruktora s različitim parametrima i pozvati jednu od njih ovisno o situaciji. Dakle, promijenimo kodnu datoteku drugog obrasca u sljedeću:

Korištenje sustava; koristeći System.Collections.Generic; using System.ComponentModel; koristeći System.Data; koristeći System.Drawing; koristeći System.Linq; koristeći System.Text; koristeći System.Threading.Tasks; koristeći System.Windows.Forms; namespace HelloApp ( javna djelomična klasa Form2: Obrazac ( public Form2() ( InitializeComponent(); ) public Form2(Form1 f) ( InitializeComponent(); f.BackColor = Color.Yellow; ) ) )

Zapravo smo samo dodali ovdje novi konstruktor public Form2(Form1 f) u kojem dobivamo prvu formu i postavljamo joj pozadinu na žutu. Sada prijeđimo na kod prvog obrasca, gdje smo pozvali drugi obrazac i promijenili ga u sljedeće:

Privatni void button1_Click(object sender, EventArgs e) ( Form2 newForm = new Form2(this); newForm.Show(); )

Budući da u ovom slučaju ključna riječ this predstavlja referencu na trenutni objekt - objekt Form1, onda će ga prilikom kreiranja drugog obrasca primiti (vezu) i preko njega kontrolirati prvi obrazac.

Sada, nakon klika na gumb, kreirat će se drugi obrazac koji će odmah promijeniti boju prvog obrasca.

Također možemo kreirati objekte trenutnog oblika:

Private void button1_Click(object sender, EventArgs e) ( Form1 newForm1 = new Form1(); newForm1.Show(); Form2 newForm2 = new Form2(newForm1); newForm2.Show(); )

Kada radite s nekoliko obrazaca, morate voditi računa da je jedan od njih glavni - koji se prvi pokreće u datoteci Program.cs. Ako imamo hrpu obrazaca otvorenih u isto vrijeme, onda kada zatvorimo glavni, zatvara se cijela aplikacija, a s njom i svi ostali obrasci.

Unatoč činjenici da je moje mišljenje o Microsoftovom Visual Studiju još uvijek isto, ponekad morate nešto učiniti na njemu. Ako se pomirimo s činjenicom da zapravo ne pišemo u C++, već u takozvanom C++/CLI, rad s poznatim vizualnim komponentama neće se toliko razlikovati od istih Borlandovih okruženja. Ali može stvoriti probleme, u usporedbi s Builderom. Razmotrimo 3 tipične situacije rada s aplikacijom koja sadrži više od jednog obrasca. Primjer okruženja je besplatni Visual C++ 2010 Express, pretpostavlja se da glavni obrazac ima zadani naziv Form1.

Primjer konstruiranja i programskog pozivanja forme

Ovaj kod se može izvršiti, na primjer, klikom na gumb u glavnom obrascu Form1.

Obrazac^form2 = gcnovi obrazac(); Button^ button2 = gcnew Button(); gumb2->Tekst = L"OK"; gumb2->Lokacija = Točka(10,10); obrazac2->Tekst = L"Moj prozor"; form2->HelpButton = true; form2->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog; form2->StartPosition = FormStartPosition::CenterScreen; obrazac2->Kontrole->Dodaj(gumb2); obrazac2->Prikaži dijalog();

Da biste dodali rukovatelj klikovima za programski generiran gumb button2, samo napišite prije posljednjeg retka koda:

Button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);

Prije nego se pozove metoda form2->ShowDialog() ili form2->Show();

U ovom slučaju, kod rukovatelja nalazi se u trenutnom modulu Form1.h:

Privatno: System::Void button2_Click(System::Object^ pošiljatelj, System::EventArgs^ e) ( MessageBox::Show("Ovdje"); )

Pozovite drugi obrazac iz glavnog obrasca

U izborniku odaberite Projekt - Dodaj novi element- Obrazac - ime Obrazac2

Dodajmo operatora

#include "Form2.h"

prije prvog imenskog prostora u Form1.h (to jest, na samom početku datoteke).

Uključimo pokazivač na instancu klase u javni odjeljak klase Form1:

Obrazac2^F2;

Dodajmo kod tamo gdje trebamo kreirati i pozvati drugi obrazac:

F2=gcnewForm2(); F2->Prikaži();

Za programsko brisanje drugog obrasca prikladan je sljedeći kod:

Izbriši F2;

Treba napomenuti da pokazivač pohranjuje adresu samo jednog obrasca, onog koji je posljednji kreiran. Ako uzastopno kreiramo nekoliko obrazaca pomoću ovog koda, samo će posljednji biti izbrisan. Alternativno, pokušajte s nizom oblika opisanim u nastavku.

Opišimo potrebne podatke u klasi obrasca Form1 (ovdje ime i imenski prostor projekta Tabulator, ako je potrebno, zamijenite svojim):

Static const int MAX_FORMS = 100; //Maksimalni broj obrazaca int FormCount; //Formiraj polje brojača ^F2; //Pokazivač na niz obrazaca

Zatim inicijaliziramo podatke pomoću događaja Load glavnog obrasca:

FormCount=0; F2 = gcnovi niz (MAX_FORMS);

Zatim ćemo implementirati kod za stvaranje sljedeće forme

If(FormCount Pokazati(); ) else MessageBox::Show("Previše obrazaca!");

i njegovo uklanjanje:

If (FormCount) ( izbriši F2; FormCount--; )

Ako želimo kreirati podređene forme ne zasebno, već unutar nadređene forme, tada u svojstvima Form1 moramo naznačiti da je to "predak" (postavite svojstvo IsMdiParent = true), a prije prikazivanja podređene forme pomoću F2->Show() operator, označite ga kao dijete Form1:

F2->MdiParent = ovo;

Pozovite metodu nadređenog obrasca iz podređenog obrasca

Teško da možemo bez korištenja .cpp datoteka, što nije loše - pisanje koda u .h datotekama uglavnom kvari ispravan C sustav :)

Opišimo proces korak po korak.

1) Postoje 2 forme - Form1 i Form2, na Formi1 postoji Button (button1, otvorit će drugu formu) i Label (label1, ovdje ćemo promijeniti tekst). Na Form2 - button1, kada se klikne, tekst u label1 će se promijeniti.

2) Budući da moramo imati pristup drugom od prvog obrasca, a od drugog do prvog, pojavit će se problem unakrsnih referenci (kada se Form1.h odnosi na Form2.h, koji se opet odnosi na Form2.h na obrazac1.h) . Kako bismo to izbjegli, premjestit ćemo kod prve forme (Form1), koja će imati pristup drugoj formi (Form2), iz .h datoteke u .cpp datoteku. Dakle, morate stvoriti datoteku Form1.cpp.

3) Deklarirajte javnu metodu Set u Form1.h tako da možete promijeniti tekst label1 (kod se može napisati na kraju datoteke, nakon #pragma endregion):

Javno: void Set(String^ text) ( label1->Text = text; )

4) U datoteku Form2.h uključujemo Form1.h (na početku):

#include "Form1.h"

i kreirajte konstruktor koji će prihvatiti i spremiti vezu na prvi obrazac za daljnju upotrebu:

Form2(Form1^ roditelj) ( InitializeComponent(); parentForm = parent; ) //možete napisati vezu odmah ispod: privatno: Form1^ parentForm;

5) Klikom na gumb u Formi2, pozvat ćemo metodu Set nadređene forme:

Privatno: System::Void button1_Click(System::Object^ pošiljatelj, System::EventArgs^ e) ( parentForm->Set("pozdrav iz forme2"); parentForm->Show(); this->Hide(); )

6) Ostaje otvoriti drugi obrazac u prvom obrascu. Da bismo to učinili, premjestimo rukovatelj klikom gumba iz Form1.h u Form1.cpp, au .h datoteci ostavimo samo njegovu deklaraciju.

Ponekad je potrebno elementima jedne forme pristupiti iz druge tijekom izvođenja programa. Na primjer, postoji forma Form1, iz nje otvaramo drugu Formu2 i sada, radeći u Formi2, moramo pristupiti elementima nadređene forme Form1. Pronašao sam nekoliko načina za to.

1. metoda. Prosljeđivanje reference na javnu varijablu.

Prostor imena WindowsApplication1 ( javna djelomična klasa Form1: Obrazac ( javni Form1() ( InitializeComponent(); ) privatni void button1_Click(objekt pošiljatelj, EventArgs e) ( Form2 frm = new Form2(); frm.but1 = this.button1; // pošalji veza na gumb u obliku Form2 frm.ShowDialog(); ) ) )

U Formi2, varijabla na koju je proslijeđena veza sada će odgovarati button1 iz Forme1

Namespace WindowsApplication1 ( public partial class Form2: Form ( public Button but1; // ova će varijabla sadržavati vezu na button1 iz Form1 public Form2() ( InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( but1. Text = "test"; // promijenite tekst na gumbu button1 Forme1 ) ) )

2. metoda. Prosljeđivanje veze na podređeni obrazac.

Suština je otprilike ista u 1. metodi. Kada otvaramo Form2, u nju prosljeđujemo poveznicu na element koji planiramo kasnije promijeniti.

Namespace WindowsApplication1 ( public partial class Form1: Form ( public Form1() ( InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Form2 frm = new Form2(this.button1); // proslijedite vezu na gumb u obrazac Form2 frm.ShowDialog(); ) ) )

Sada u Formi2 moramo kreirati varijablu koja će sadržavati poveznicu na ovaj gumb i preko nje ćemo pristupiti tipki na Formi1 (linije 5,7,9 i 15).

Namespace WindowsApplication1 ( public partial class Form2: Form ( private Button but1; // ova će varijabla sadržavati vezu na gumb button1 iz obrasca Form1 public Form2 (Button but) // dobiti vezu na gumb u varijabli but ( but1 = ali; // sada će but1 biti poveznica na gumb button1 InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( but1.Text = "test"; // promijenite tekst na gumbu button1 obrasca1 ) ) )

3. metoda. Pristup cijelom matičnom obrascu.

Da biste to učinili, morate izvršiti izmjene u nekoliko datoteka, ali u isto vrijeme ćemo imati pristup svim elementima nadređenog obrasca i ne moramo proslijediti vezu na svaki element, kao u metodi 1.

Korak 1. U datoteci Program.cs kreirajte javnu varijablu f1 (redak 5).

Namespace WindowsApplication1 ( static class Program ( public static Form1 f1; // varijabla koja će sadržavati vezu na obrazac Form1 static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1( ) ); ) ) )

Korak 2. Otvor Form1.Designer.cs a u njemu za elemente kojima će trebati pristupiti iz druge forme mijenjamo privatna na javnost. Na primjer, učinimo button1 na Formi1 dostupnim za promjene.

Public System.Windows.Forms.Button button1; // privatno zamijenjeno javnim

3. korak. Prilikom kreiranja Forme1, varijabli f1 dodjeljujemo vezu na ovu formu (linija 7)

Namespace WindowsApplication1 ( public partial class Form1: Form ( public Form1() ( Program.f1 = this; // sada će f1 biti poveznica na obrazac Form1 InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Form2 frm = novi obrazac2(); frm.ShowDialog(); ) ) )

Korak 4. Sada iz apsolutno bilo koje forme ili iz bilo koje klase možete pristupiti elementu button1 koji se nalazi na Formi1 ovako: Program.f1.button1. Na primjer, neka gumb na Formi2 promijeni tekst gumba na Formi1:

Namespace WindowsApplication1 ( public partial class Form2: Form ( public Form2() ( InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Program.f1.button1.Text = "test"; // Promjena teksta na gumb obrasca Form1 ) ) )

Od admina.

Učenje C# je sporo. ali se vjerno nastavlja. Nedavno sam
dao je primjer kako otvoriti drugi iz jednog obrasca u Visual C#. U principu, sve je jednostavno.

Danas se pojavio sljedeći zadatak: pokrenuti modalni obrazac iz glavnog obrasca aplikacije; kada se zatvori, ovaj obrazac mora proslijediti neke podatke (tekst, vrijednosti svojstava itd.) kontrolama na glavnom obrascu. Ovaj problem nije moguće riješiti metodom opisanom u prethodnom postu o obrascima jer u ovom slučaju jednostavno stvaramo novi objekt obrasca s novim vrijednostima za sva svojstva. Srećom, C# ima prekrasan skupljač smeća... Ali poanta nije u sakupljaču, već kako otvoriti dječji obrazac u C#, a zatim se iz njega vratiti u glavni obrazac?

Za početak, postavimo početne (početne) podatke.

Tako. Imamo glavni obrazac za prijavu:

Ova forma također sadrži TextBox s nazivom TBDialog i gumb Button na koji treba kliknuti:

  1. Prolazna vrijednost Svojstva teksta od TBDialog do TBMain;
  2. Zatvori fDialog;

Sada pogledajmo redom cijeli proces.

Prvo, uvijek je vrijedno zapamtiti da je prema zadanim postavkama svim svojstvima, varijablama i metodama u C# dodijeljen modifikator privatna– stoga, da bismo došli od druge forme do kontrole na prvoj, moramo postaviti modifikator za TBMain javnost na svome. Da biste to učinili, odaberite element TBMain u dizajneru obrazaca, idite na prozor svojstava i promijeniti vrijednost nekretnine Modifikatori S privatna na javnost

Sada će TBMain biti vidljiv u drugim objektima. Idemo dalje. Kako bismo otvorili formu u modalnom načinu, moramo koristiti jednu od dvije opcije za ShowDialog() metodu:

public DialogResult ShowDialog() ; public DialogResult ShowDialog(IWin32Window owner) ;

U prvom slučaju metoda prikazuje formu kao modalni dijaloški okvir s trenutno aktivnim prozorom postavljenim kao vlasnik, a u drugom slučaju možemo samostalno odrediti koja će forma postati vlasnik našeg modalnog prozora.

Na primjer, upotrijebimo drugu verziju metode ShowDialog() i modalno prikažimo drugu formu. Da bismo to učinili, napisat ćemo sljedeće:

Evo opet sam iskoristio ključna riječ ovaj , koji pokazuje na trenutni objekt, tj. postavi glavni obrazac kao vlasnika ( fGlavni). Sada prijeđimo izravno na rješavanje našeg problema i odgovorimo na pitanje: kako prenijeti vrijednost iz jednog oblika u drugi? Svaka kontrola ima izvanredna svojstva Vlasnik – koji upućuje na roditelja:

Sada možete pokrenuti projekt i pobrinuti se da se tekst iz TextBox-a na dječjem obrascu savršeno prenosi u TextBox na prvom. Za svaki slučaj, objavljujem izvorni kod projekta o kojem se govori u primjeru.