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

Pitanje koje se obrađuje u ovom članku je vjerojatnije da se odnosi na temu izgradnje arhitekture aplikacije, a ne konkretno na problem koji se razmatra. Prijenos podataka iz jednog oblika u drugi uopće nije težak. Da bismo to učinili, dovoljno je otvoriti kontrolu čije podatke želimo dobiti, odnosno označiti je modifikatorom public. Takođe, moguća je i druga opcija. Na primjer, u prvom obliku kreiramo objekt drugog oblika tako što konstruktoru prosljeđujemo referencu na sebe, odnosno prosljeđujemo referencu na prvi iz prvog oblika u drugi
SecondForm secondForm = new SecondForm(this);
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 uobičajena. Međutim, svojom jednostavnošću nosi mnoge potencijalne probleme, od kojih je glavni kršenje principa enkapsulacije. Jednom riječju, drugi oblik ne bi trebao znati ništa o postojanju prvog i, još više, ne bi trebao moći utjecati na njega.

Rješenje ovog problema je prilično jednostavno. Pogledajmo direktno kod. Stvaramo u dizajneru glavni oblik(pokrenut će se kada se aplikacija pokrene). Hajde da stavimo jednu TextBox, Label I Dugme.

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

Slično prvom, ima iste kontrole. Ne treba nam više. Ulazna tačka aplikacije pokreće glavni obrazac:

Korišćenje sistema; koristeći System.Collections.Generic; koristeći System.Linq; koristeći System.Windows.Forms; imenski prostor From1FormTo2 ( statična 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šćenje sistema; koristeći System.Collections.Generic; koristeći System.ComponentModel; koristeći System.Data; koristeći System.Drawing; koristeći System.Linq; koristeći System.Text; koristeći System.Windows.Forms; imenski prostor From1FormTo2 ( javna djelomična klasa MainForm: Form ( //drugi oblik SecondForm secondForm; //konstruktor public MainForm() ( InitializeComponent(); ) // rukovatelj događaja prijenosa podataka //iz glavnog obrasca u drugi privatni void btn_mainForm_Click(object pošiljalac, EventArgs e) ( secondForm = new SecondForm(tb_mainForm.Text.Trim()); secondForm.ShowDialog(); if (secondForm.DialogResult == DialogResult.OK) tb_mainForm.Text = secondForm.ReturnData());

Shodno tome, ne zaboravite da povežete dugme sa događajem Kliknite. Ovdje u glavnoj klasi obrasca postoji polje SecondForm secondForm, koji predstavlja drugi objekat forme. Kada kliknete na dugme „Pošalji“, kreira se drugi obrazac (poziva se preopterećeni konstruktor, kreiraćemo ga kasnije) i pokreće se metodom ShowDialog(). U ovom slučaju, ova metoda je prikladna za nas. Štaviše, nakon toga obavezno provjerimo da li je drugi obrazac zatvoren, ali smo kliknuli na njegovo dugme. Ako je na drugom obrascu kliknuto dugme, tada bi prvi obrazac trebao prihvatiti podatke iz drugog. Ovo se dešava pozivanjem metode ReturnData() u drugom obliku.

Sada je najzanimljiviji dio kod drugog obrasca:

Korišćenje sistema; koristeći System.Collections.Generic; koristeći System.ComponentModel; koristeći System.Data; koristeći System.Drawing; koristeći System.Linq; koristeći System.Text; koristeći System.Windows.Forms; imenski prostor From1FormTo2 ( javna djelomična klasa SecondForm: Form ( //preopterećeni konstruktor public SecondForm(string data) ( InitializeComponent(); tb_secondForm.Text = data; ) //upravljač događaja prijenosa podataka //iz drugog obrasca u glavni privatni void btn_secondForm_Click (pošiljalac objekta, EventArgs e) ( this.DialogResult = DialogResult.OK; ) // javna metoda pristupiti // tekstualnom polju ovog obrasca public string ReturnData() ( return (tb_secondForm.Text.Trim()); ) ) )

Kao što vidite, postoji jedno preopterećenje konstruktora koje prihvata tip stringa. Zapamtite da pokušavamo prenijeti tekst iz TextBox-a. U konstruktoru, komponente su planirane za inicijalizaciju i tekst polja teksta je postavljen na prenesenu vrijednost iz prvog obrasca. Dalje, pretplatom na događaj Kliknite za dugme drugog obrasca kreirali smo rukovalac btn_secondForm_Click, koji simulira rad dugmeta „U redu“ bilo kojeg dijaloškog okvira. Dakle, klikom na dugme „Pošalji“ (drugog obrasca) izvršavamo uslov

(secondForm .DialogResult == DialogResult .OK)

Prvi oblik, dakle, poziva metodu secondForm.ReturnData(), postavljamo tekstualno polje prvog obrasca na vrijednost tekstualnog polja drugog obrasca.

Posao ovu metodu, mislim, više nije potrebno objašnjenje. Jednostavno vraća tekst iz jednog tekstualnog polja, zadržavajući ga privatnim.

Kao rezultat toga, prenijeli smo podatke u drugi oblik iz prvog i iz drugog u prvi bez kršenja principa enkapsulacije.

Pokušajte da unesete tekst “aaa” u tekstualno polje prvog obrasca i kliknete na dugme. Ovaj tekst ćete vidjeti u tekstualnom polju u drugom obrascu koji se otvori. Pokušajte promijeniti tekst u “aaa ppp” i kliknite na dugme. Vidjet ćete kako će se, nakon zatvaranja druge forme, 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.

Posljednje ažurirano: 31.10.2015

Da biste projektu dodali još jedan obrazac, kliknite desnim tasterom miša na naziv projekta u prozoru Solution Explorer i izaberite Add->Windows Form...

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

Dakle, dodali smo drugi obrazac našem projektu. Pokušajmo sada implementirati interakciju između dva oblika. Recimo da će prvi obrazac pozvati drugi obrazac kada se klikne na dugme. Prvo, dodajmo dugme prvom obrascu, Form1, i dvaput kliknite na dugme da biste otišli na fajl koda. Dakle, bit ćemo odvedeni do obrađivača događaja klika na dugme, koji se kreira po defaultu nakon dvostrukog klika na dugme:

Privatno void dugme1_Kliknite (pošiljalac objekta, EventArgs e) ( )

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

Privatno void button1_Klik (pošiljalac objekta, EventArgs e) ( Form2 newForm = new Form2(); newForm.Show(); )

Sada uradimo suprotno - tako da drugi oblik utič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 obrazac u konstruktoru.

Dakle, prijeđimo na drugi obrazac i prijeđimo na njegov kod – kliknite desnim tasterom miša na obrazac i odaberite Prikaži kod. Za sada je prazan i sadrži samo konstruktor. Pošto C# podržava preopterećenje metoda, možemo kreirati nekoliko metoda i konstruktora s različitim parametrima i pozvati jednu od njih ovisno o situaciji. Dakle, promijenimo kodni fajl drugog oblika u sljedeći:

Korišćenje sistema; koristeći System.Collections.Generic; koristeći 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; imenski prostor HelloApp ( javna djelomična klasa Form2: Form ( javni Form2() ( InitializeComponent(); ) javni Form2(Form1 f) ( InitializeComponent(); f.BackColor = Color.Yellow; ) ) )

U stvari, samo smo dodali ovdje novi konstruktor public Form2(Form1 f) u kojoj dobijamo prvi obrazac i postavljamo njegovu pozadinu na žutu. Sada pređimo na kod prvog obrasca, gdje smo pozvali drugi obrazac i promijenimo ga u sljedeće:

Privatno void button1_Klikni(pošiljalac objekta, EventArgs e) ( Form2 newForm = novi Form2(ovo); newForm.Show(); )

Pošto u ovom slučaju ključna riječ this predstavlja referencu na trenutni objekt - Form1 objekt, onda će pri kreiranju druge forme primiti (link) i preko nje kontrolirati prvi obrazac.

Sada, nakon klika na dugme, kreiraće se drugi obrazac, koji će odmah promeniti boju prvog obrasca.

Također možemo kreirati objekte trenutnog oblika:

Privatni void button1_Klik (pošiljalac objekta, EventArgs e) ( Form1 newForm1 = novi Form1(); newForm1.Show(); Form2 newForm2 = novi Form2(newForm1); newForm2.Show(); )

Kada radite sa nekoliko obrazaca, morate uzeti u obzir da je jedan od njih glavni - koji se prvi pokreće u datoteci Program.cs. Ako imamo otvorenu gomilu obrazaca u isto vrijeme, onda kada zatvorimo glavni, zatvara se cijela aplikacija, a sa njom i svi ostali oblici.

Uprkos činjenici da je moje mišljenje o Microsoftovom Visual Studiju i dalje isto, ponekad morate nešto da uradite na njemu. Ako se pomirimo sa činjenicom da pišemo, zapravo, ne u C++, već u takozvanom C++/CLI, rad sa poznatim vizuelnim komponentama neće se toliko razlikovati od istih Borland okruženja. Ali može stvoriti probleme, u poređenju sa Builder-om. Razmotrimo 3 tipične situacije rada sa aplikacijom koja sadrži više od jedne forme. Primer okruženja je besplatan Visual C++ 2010 Express, pretpostavlja se da glavni obrazac ima podrazumevano ime Form1.

Primjer konstrukcije i programskog pozivanja forme

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

Form^form2 = gcnew Form(); Button^ button2 = gcnew Button(); dugme2->Tekst = L"OK"; dugme2->Lokacija = Tačka(10,10); form2->Text = L"Moj prozor"; form2->HelpButton = istina; form2->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog; form2->StartPosition = FormStartPosition::CenterScreen; form2->Kontrole->Dodaj(button2); form2->ShowDialog();

Da biste dodali rukovalac klikovima za programski generirano dugme dugme2, samo napišite prije zadnje linije koda:

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

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

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

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

Pozovite drugi obrazac iz glavnog obrasca

U meniju izaberite Projekat - Dodaj novi element- Obrazac - naziv Obrazac2

Dodajmo operator

#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 dio klase Form1:

Form2^F2;

Dodajmo kod gdje trebamo kreirati i pozvati drugi obrazac:

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

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

Delete F2;

Treba napomenuti da pokazivač pohranjuje adresu samo jednog obrasca, onog koji je zadnji kreiran. Ako uzastopno kreiramo nekoliko obrazaca koristeći ovaj kod, samo će posljednji biti obrisan. Alternativno, isprobajte niz oblika opisan u nastavku.

Opišimo potrebne podatke u klasi forme Form1 (ovdje naziv i prostor imena Tabulator projekta, ako je potrebno, zamijenite svojim):

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

Zatim inicijaliziramo podatke koristeći događaj Load glavnog obrasca:

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

Zatim ćemo implementirati kod za kreiranje sljedećeg obrasca

If(FormCount Prikaži(); ) else MessageBox::Show("Previše obrazaca!");

i njegovo uklanjanje:

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

Ako želimo da kreiramo podređene forme ne odvojeno, već unutar nadređenog obrasca, onda u svojstvima Form1 treba da naznačimo da je „predak“ (postavimo svojstvo IsMdiParent = true), a pre nego što pokažemo podređeni obrazac pomoću F2->Show() operator, označite ga kao podređeni Form1:

F2->MdiParent = ovo;

Pozovite metod roditeljskog obrasca iz podređenog obrasca

Teško da možemo bez upotrebe .cpp fajlova, što nije loše - pisanje koda u .h fajlovima generalno kvari ispravan C sistem :)

Hajde da opišemo proces korak po korak.

1) Postoje 2 obrasca - Form1 i Form2, na Form1 postoji Button (dugme1, otvoriće drugi obrazac) 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 iz prvog obrasca, a iz drugog u prvom, pojavit će se problem unakrsnih referenci (kada se Form1.h odnosi na Form2.h, koji se opet odnosi u Form1.h) . Kako bismo to izbjegli, premjestit ćemo kod prvog obrasca (Form1), koji će imati pristup drugom obrascu (Form2), iz .h datoteke u .cpp datoteku. Dakle, morate kreirati 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 sačuvati vezu do prvog obrasca za dalju upotrebu:

Form2(Form1^ parent) ( InitializeComponent(); parentForm = parent; ) //ispod odmah ispod možete napisati link: private: Form1^ parentForm;

5) Klikom na dugme u Form2, pozvaćemo Set metod roditeljskog obrasca:

Privatno: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) ( parentForm->Set("zdravo iz forme2"); parentForm->Show(); this->Hide(); )

6) Ostaje da otvorite drugi obrazac u prvom obrascu. Da bismo to uradili, pomeramo obrađivač klika na dugme iz Form1.h u Form1.cpp, a u .h datoteci ostavljamo samo njegovu deklaraciju.

Ponekad je potrebno pristupiti elementima jedne forme iz druge tokom izvršavanja programa. Na primjer, postoji obrazac Form1, iz njega otvaramo drugi Form2 i sada, radeći u Form2, trebamo pristupiti elementima roditeljskog obrasca Form1. Našao sam nekoliko načina da to uradim.

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

Prostor imena WindowsApplication1 ( javna djelomična klasa Form1: Form ( public Form1() ( InitializeComponent(); ) privatni void button1_Klik (object sender, EventArgs e) ( Form2 frm = new Form2(); frm.but1 = this.button1; // pošalji link do dugmeta u formi Form2 frm.ShowDialog(); ) ) )

U Form2, varijabla kojoj je veza proslijeđena će sada odgovarati button1 iz Form1

Imenski prostor WindowsApplication1 ( javna djelomična klasa Form2: Form ( public Button but1; // ova varijabla će sadržavati vezu do gumba1 iz Form1 public Form2() ( InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( but1. Text = "test"; // promijenite tekst na gumbu button1 na Form1 ) ) )

2. metoda. Prosljeđivanje veze na obrazac za dijete.

Suština je približno ista u 1. metodi. Prilikom otvaranja Form2, u njega prosljeđujemo vezu do elementa koji planiramo kasnije promijeniti.

Prostor imena WindowsApplication1 (javna djelomična klasa Form1: Form ( public Form1() ( InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Form2 frm = new Form2(this.button1); // proslijedite vezu do gumba. u obrazac Form2 frm.ShowDialog(); ) ) )

Sada u Form2 treba da kreiramo varijablu koja će sadržati vezu do ovog dugmeta i preko nje ćemo pristupiti dugmetu na Form1 (redovi 5,7,9 i 15).

Imenski prostor WindowsApplication1 ( javna djelomična klasa Form2: Form ( private Button but1; // ova varijabla će sadržavati vezu do gumba button1 iz obrasca Form1 public Form2(Button but) // dobiti vezu do gumba u varijabli ali ( but1 = ali; // sada but1 će biti veza do gumba button1 InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( but1.Text = "test"; // promijenite tekst gumba button1 na Form1 )) )

3rd method. Pristup cijelom roditeljskom obrascu.

Da biste to učinili, morate napraviti promjene u nekoliko datoteka, ali ćemo istovremeno imati pristup svim elementima nadređenog obrasca i nećemo morati prosljeđivati ​​vezu na svaki element, kao u metodi 1.

Korak 1. U fajlu Program.cs kreirajte javnu varijablu f1 (red 5).

Imenski prostor WindowsApplication1 ( statična klasa Program (javni statički 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. Otvaranje Form1.Designer.cs a u njemu se mijenjamo za elemente kojima će se morati pristupiti iz drugog oblika privatni on javnosti. Na primjer, učinimo dugme1 na obrascu1 dostupnom za promjene.

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

Korak 3. Prilikom kreiranja Form1, dodjeljujemo varijablu f1 vezu na ovaj obrazac (red 7)

Imenski prostor WindowsApplication1 ( javna djelomična klasa Form1: Form ( public Form1() ( Program.f1 = ovo; // sada će f1 biti veza do obrasca Form1 InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Form2 frm = novi Form2(); frm.ShowDialog(); ) ) )

Korak 4. Sada iz apsolutno bilo kojeg obrasca ili iz bilo koje klase možete pristupiti elementu button1 koji se nalazi na Form1 ovako: Program.f1.button1. Na primjer, neka dugme na Form2 promeni tekst dugmeta na Form1:

Imenski prostor WindowsApplication1 ( javna djelomična klasa Form2: Form ( public Form2() ( InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Program.f1.button1.Text = "test"; // Promijenite tekst na dugme obrazac Form1 ) ) )

By admin.

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

Danas se pojavio sljedeći zadatak: pokretanje modalnog obrasca iz glavne forme aplikacije; kada se zatvori, ovaj obrazac mora proći 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 kreiramo novi objekt obrasca s novim vrijednostima za sva svojstva. Na sreću, C# ima divan sakupljač smeća... Ali poenta nije u sakupljaču, već kako otvoriti podređeni obrazac u C#, a zatim se iz njega vratiti na glavni obrazac?

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

Dakle. Imamo glavni obrazac za prijavu:

Ovaj obrazac također sadrži TextBox sa imenom TBDialog i dugme Button na koje treba da kliknemo:

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

Pogledajmo sada cijeli proces po redu.

Prvo, uvijek je vrijedno zapamtiti da je po defaultu svim svojstvima, varijablama i metodama u C# dodijeljen modifikator privatni– dakle, da bismo iz drugog obrasca došli do kontrole na prvom, moramo postaviti modifikator za TBMain javnosti na svoju ruku. Da biste to učinili, odaberite element TBMain u dizajneru obrasca, idite na prozor sa svojstvima i promijenite vrijednost svojstva Modifikatori With privatni on javnosti

Sada će TBMain biti vidljiv u drugim objektima. Idemo dalje. Da bismo otvorili obrazac u modalnom modu, moramo koristiti jednu od dvije opcije za ShowDialog() metodu:

javni DialogResult ShowDialog() ; javni DialogResult ShowDialog(IWin32Window vlasnik) ;

U prvom slučaju, metoda prikazuje formu kao modalni dijaloški okvir sa trenutnim aktivnim prozorom postavljenim kao vlasnikom, au drugom možemo samostalno odrediti koji će obrazac postati vlasnik za naš modalni prozor.

Na primjer, koristimo drugu verziju metode ShowDialog() i prikažimo drugi obrazac modalno. Da bismo to uradili, napisaćemo sledeće:

Evo opet sam iskoristio ključna riječ ovo , koji ukazuje na trenutni objekat, tj. postavite glavni obrazac kao vlasnika ( fMain). Sada idemo direktno na rješavanje našeg problema i odgovorimo na pitanje: kako prenijeti vrijednost iz jednog oblika u drugi? Svaka kontrola ima izvanredno svojstvo Vlasnik – koji upućuje na roditelja:

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