Dodavanje obrazaca. Interakcija između oblika
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 na dugme 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 gumbu1 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 trebamo kreirati varijablu koja će sadržavati vezu do ovog gumba i preko nje ćemo pristupiti gumbu 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 = but; // sada but1 će biti veza do 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();
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 ) ) )
Danas želim da pričam o tome kako da kreiram Windows Forms projekat u C++ u Visual Studio IDE 2013. Činjenica je da je, počevši od VS 2012, stavka uklonjena sa liste projekata koji se mogu kreirati Windows aplikacija Forms. Sada govorim o onom u C++-u, takav projekat možete kreirati u C# odabirom odgovarajuće stavke u odjeljku za kreirane projekte. Međutim, činjenica da se takav projekat ne može odabrati sa liste ne znači da ga ne možete sami kreirati. Upravo o tome želim govoriti u ovom članku.
Prva stvar koju treba da uradite je da pokrenete Visual Studio. Kada se VS pokrene, kliknite Datoteka > Novo > Projekt
Nakon toga, otvorit će se prozor u kojem će se tražiti da odaberete tip projekta. Moramo odabrati pododjeljak CLR u odjeljku Visual C++ i odabrati Prazan CLR projekat.
Kada je projekat kreiran, u Solution Exploreru kliknite desnim tasterom miša na kreirani projekat. U kontekstnom meniju koji se otvori izaberite Dodaj > Kreiraj element i u meniju koji se otvori, u odeljku korisničkog interfejsa, izaberite Windows Forms
Kada se obrazac doda, izaberite datoteku MyForm.cpp u Solution Exploreru. Nova kartica će se otvoriti ispred vas sa jednom linijom koda:
#include "MyForm.h"
Moramo dodati sljedeći kod ovom fajlu:
Korištenje imenskog prostora System; koristeći prostor imena System::Windows::Forms; void Main(niz
Nakon toga u svojstvima projekta. Odaberite pododjeljak Sistem odeljku Linker i u liniji Podsistem iz padajućeg menija izaberite Windows (/SUBSYSTEM:WINDOWS) i kliknite na Primeni.
Bez zatvaranja prozora sa svojstvima projekta, idite na pododjeljak Napredno i u liniji Tačka ulaska mi pišemo Main a zatim pritisnite tipku UREDU.
Ovim se završavaju postavke projekta. Za uređivanje izgled potrebno je da odete na karticu MyForm.h [Dizajner] tako što ćete dvaput kliknuti na datoteku MyForm.h u Solution Exploreru.
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 to može stvoriti probleme, u poređenju sa Builderom. Razmotrimo 3 tipične situacije u kojima se radi sa aplikacijom koja sadrži više od jednog oblika.
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; oblik2->Kontrole->Dodaj(dugme2); form2->ShowDialog();
Da biste dodali rukovao klikom za programski generirano dugme button2, samo napišite prije posljednjeg reda 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 izborniku odaberite Projekt - 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 iznos forms int FormCount; // Niz brojača obrazaca
Zatim inicijaliziramo podatke koristeći događaj Load glavnog obrasca:
FormCount=0; F2 = gcnew niz
Zatim implementiramo kod da kreiramo sljedeći obrazac
If(FormCount
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 koristeći 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 se nalazi 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, prenosimo rukovalac klika na dugme sa Form1.h na Form1.cpp, a u .h datoteci ostavljamo samo njegovu deklaraciju.
Problem koji se obrađuje u ovom članku više 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, a glavni je 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. U dizajneru kreiramo glavni obrazac (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 tekstualnog polja glavne forme ć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 za pristup // 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.
Djelovanje ove metode, mislim, više ne zahtijeva 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.
- Priprema prženih paprika za zimu: recepti sa belim lukom u ulju i marinadom
- Kiseli sos. Recepti za kuvanje. Slatko-kiseli sos za piletinu (recept korak po korak) Gotov slatko-kiseli sos
- Pire od bundeve: recepti sa piletinom, sirom, kajmakom, dijetalni i za djecu, od Julije Vysotske, u loncu i sporom kuhaču
- Recepti za brašno od orašastih plodova