Menambahkan formulir. Interaksi antar bentuk

Terlepas dari kenyataan bahwa pendapat saya tentang microsoft Studio visual tetap saja, terkadang Anda harus melakukan sesuatu untuk itu. Jika kita menerima kenyataan bahwa kita menulis dalam kasus ini, sebenarnya bukan dalam C ++, tetapi dalam apa yang disebut C ++ / CLI , bekerja dengan komponen visual yang biasa tidak akan jauh berbeda dari yang sama lingkungan Borland. Tapi itu bisa menimbulkan masalah dibandingkan dengan Builder. Mari kita pertimbangkan 3 situasi khas bekerja dengan aplikasi yang berisi lebih dari satu formulir. Lingkungan contoh adalah Visual C ++ 2010 Express gratis, diasumsikan bahwa formulir utama memiliki nama default Form1.

Contoh membangun dan secara terprogram memanggil formulir

Kode ini dapat dijalankan, misalnya dengan menekan tombol di form utama Form1.

Formulir^form2 = Formulir gcnew(); Tombol^tombol2 = gcnewButton(); button2->Teks = L"OK"; button2->Lokasi = Titik(10,10); form2->Teks = L"Jendela Saya"; form2->HelpButton = true; form2->FormBorderStyle = Sistem::Windows::Formulir::FormBorderStyle::FixedDialog; form2->StartPosition = FormStartPosition::CenterScreen; form2->Kontrol->Tambah(tombol2); form2->ShowDialog();

Untuk menambahkan penangan klik untuk tombol2 yang dibuat secara terprogram, cukup tulis sebelum baris kode terakhir:

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

Sebelum metode form2->ShowDialog() atau form2->Show() dipanggil;

Pada saat yang sama, kode handler ditempatkan di modul saat ini Form1.h:

Pribadi: System::Void button2_Click(System::Object^ pengirim, System::EventArgs^ e) ( MessageBox::Show("Here"); )

Panggil formulir lain dari formulir utama

Di menu, pilih Proyek - Tambahkan elemen baru - Formulir - beri nama Formulir2

Mari tambahkan operator

# sertakan "Formulir2.h"

sebelum namespace pertama di Form1.h (yaitu, di awal file).

Mari sertakan penunjuk ke instance kelas di bagian publik kelas Form1:

Bentuk2^F2;

Mari tambahkan kode di mana kita perlu membuat dan memanggil form kedua:

F2=gcnew Form2(); F2->Tampilkan();

Untuk menghapus formulir kedua secara terprogram, kodenya cocok

Hapus F2;

Perlu dicatat bahwa penunjuk hanya menyimpan alamat satu formulir, yang dibuat terakhir. Jika kita berturut-turut membuat beberapa formulir dengan kode ini, hanya yang terakhir yang akan dihapus. Alternatifnya, coba berbagai bentuk, yang dijelaskan di bawah ini.

Mari jelaskan data yang diperlukan dalam formulir kelas Form1 (di sini nama dan namespace proyek Tabulator, jika perlu, ganti dengan milik Anda):

int statis const MAX_FORMS = 100; // Jumlah maksimum form int FormCount; // Bentuk larik penghitung ^F2; //Pointer ke array bentuk

Kemudian kami menginisialisasi data pada acara Muat dari formulir utama:

FormCount=0; F2 = larik gcnew (MAX_FORM);

Kemudian kami menerapkan kode untuk membuat formulir berikutnya

Jika (FormCount menunjukkan(); ) else MessageBox::Show("Terlalu banyak formulir!");

dan penghapusannya:

Jika (FormCount) ( hapus F2; ​​FormCount--; )

Jika kita ingin membuat formulir anak tidak secara terpisah, tetapi di dalam formulir induk, maka di properti Form1 kita perlu menunjukkan bahwa itu adalah "leluhur" (setel properti IsMdiParent = true), dan sebelum menampilkan formulir anak dengan F2 ->Show() operator, tandai sebagai anak Form1:

F2->MdiParent = ini;

Panggil metode formulir induk dari formulir anak

Kami hampir tidak dapat melakukannya tanpa melibatkan file .cpp, yang lumayan - menulis kode di file .h dari C "shnik yang benar biasanya rusak :)

Mari kita uraikan prosesnya langkah demi langkah.

1) Ada 2 form - Form1 dan Form2 , pada Form1 ada Button (button1 , akan membuka form kedua) dan Label (label1 , disini kita akan mengubah teks). Di Form2 - button1 , dengan mengklik di mana teks di label1 akan berubah.

2) Karena kita perlu memiliki akses ke bentuk kedua dari bentuk pertama, dan dari bentuk kedua ke bentuk pertama, masalah referensi silang akan muncul (ketika Form1.h merujuk ke Form2.h , yang, pada gilirannya, merujuk lagi ke Form1.h). Untuk menghindari hal ini, kami akan memindahkan kode formulir pertama (Form1), yang akan memiliki akses ke formulir kedua (Form2), dari file .h ke file .cpp. Jadi, Anda perlu membuat file Form1.cpp .

3) Deklarasikan metode Set publik di Form1.h sehingga Anda dapat mengubah teks label1 (kode dapat ditulis di akhir file, setelah #pragma endregion):

Publik: void Set(String^ teks) ( label1->Teks = teks; )

4) Di file Form2.h, kami menyertakan Form1.h (di awal):

#sertakan "Formulir1.h"

dan buat konstruktor yang akan menerima dan menyimpan referensi ke formulir pertama untuk digunakan nanti:

Form2(Form1^ parent) ( InitializeComponent(); parentForm = parent; ) //Anda dapat menambahkan tautan tepat di bawah: private: Form1^ parentForm;

5) Saat mengklik tombol di Form2, kami akan memanggil metode Set dari formulir induk:

Pribadi: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) ( parentForm->Set("hello from form2"); parentForm->Show(); this->Hide(); )

6) Tetap dalam bentuk pertama untuk membuka bentuk kedua. Untuk melakukan ini, transfer penangan klik tombol dari Form1.h ke Form1.cpp , dan tinggalkan hanya deklarasinya di file .h.

Oleh admin.

Belajar C# lambat. tapi itu berjalan tepat. Baru-baru ini saya
memberikan contoh cara membuka yang lain dari satu formulir di Visual C#. Pada prinsipnya, semuanya sederhana.

Hari ini, tugas berikut telah muncul: meluncurkan formulir modal dari formulir utama aplikasi, formulir ini, ketika ditutup, harus mentransfer data apa pun (teks, nilai properti, dll.) ke kontrol pada formulir utama. Tidak mungkin menyelesaikan masalah ini dengan cara yang dijelaskan di posting sebelumnya tentang formulir. dalam hal ini, kita cukup membuat objek form baru dengan nilai baru untuk semua properti. Untungnya, C # memiliki pengumpul sampah yang luar biasa ... Tapi intinya bukan pada pengumpul, tetapi bagaimana membuka formulir anak di C #, dan kemudian kembali ke yang utama darinya?

Untuk memulainya, mari kita atur data awal (awal).

Jadi. Kami memiliki formulir aplikasi utama:

Formulir ini juga berisi TextBox bernama TBDialog dan Button on click yang harus kita:

  1. Meneruskan nilai properti Text dari TBDialog ke TBMain;
  2. Tutup fDialog;

Sekarang pertimbangkan seluruh proses kerja secara berurutan.

Pertama, Anda harus selalu ingat bahwa secara default, semua properti, variabel, dan metode di C# diberi pengubah pribadi- oleh karena itu, untuk beralih dari bentuk kedua ke kontrol yang pertama, kita perlu mengatur pengubah di TBMain publik sendiri. Untuk melakukan ini, pilih elemen TBMain di konstruktor formulir, buka jendela properti dan mengubah nilai properti Pengubah Dengan pribadi pada publik.

Sekarang TBMain akan terlihat di objek lain. Kami melanjutkan. Untuk membuka formulir dalam mode modal, kita perlu menggunakan salah satu dari dua opsi untuk metode ShowDialog() :

publik DialogResult ShowDialog() ; DialogResult ShowDialog publik (pemilik IWin32Window);

Dalam kasus pertama, metode menampilkan formulir sebagai kotak dialog modal dengan jendela aktif saat ini ditetapkan sebagai pemilik, dan dalam kasus kedua, kita dapat secara mandiri menentukan formulir mana yang akan menjadi pemilik jendela modal kita.

Sebagai contoh, mari gunakan varian kedua dari metode ShowDialog() dan tampilkan bentuk kedua secara sederhana. Untuk melakukan ini, kami menulis yang berikut:

Di sini saya menggunakan lagi kata kunci ini , yang menunjuk ke objek saat ini, yaitu. atur formulir utama sebagai pemilik ( fMain). Sekarang kita langsung menyelesaikan masalah kita dan menjawab pertanyaannya: bagaimana cara meneruskan nilai dari satu bentuk ke bentuk lainnya? Setiap kontrol memiliki properti yang luar biasa Pemilik - yang menunjuk ke induk:

Sekarang Anda dapat menjalankan proyek dan memastikan bahwa teks dari TextBox pada formulir anak ditransfer dengan sempurna ke TextBox pada yang pertama. Untuk berjaga-jaga, saya memposting kode sumber proyek yang dipertimbangkan dalam contoh.

Terkadang Anda perlu merujuk ke elemen satu formulir dari formulir lainnya selama eksekusi program. Misalnya, ada formulir Form1, dari mana kita membuka Form2 lain dan sekarang, bekerja di formulir Form2, kita perlu mengakses elemen formulir induk Form1. Saya telah menemukan beberapa cara untuk melakukan ini.

cara pertama. Melewati referensi ke variabel publik.

Namespace WindowsApplication1 ( public partial class Form1: Form ( public Form1() ( InitializeComponent(); ) private void button1_Click(pengirim objek, EventArgs e) ( Form2 frm = new Form2(); frm.but1 = this.button1; // pass tautan ke tombol di Form2 frm.ShowDialog(); ) ) )

Di Form2, variabel yang diteruskan tautannya sekarang akan sesuai dengan tombol1 dari Form1

Namespace WindowsApplication1 ( public partial class Form2: Form ( public Button but1; // variabel ini akan berisi referensi ke tombol button1 dari Form1 public Form2() ( InitializeComponent(); ) private void button1_Click(pengirim objek, EventArgs e) ( but1 Text = "test"; // ubah teks pada tombol button1 dari Form1 ) ) )

cara ke-2. Meneruskan tautan ke formulir anak.

Intinya kurang lebih sama, lalu di metode pertama. Saat membuka formulir Form2, kami meneruskan tautan ke elemen yang akan kami ubah nanti.

Namespace WindowsApplication1 ( public partial class Form1: Form ( public Form1() ( InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Form2 frm = new Form2(this.button1); // berikan tautan tombol ke form Form2 frm.ShowDialog(); ) ) )

Sekarang, di Form2, Anda perlu membuat variabel yang berisi link ke tombol ini dan melaluinya kita akan mengakses tombol di Form1 (baris 5,7,9 dan 15).

Namespace WindowsApplication1 ( public partial class Form2: Form ( private Button but1; // variabel ini akan berisi referensi ke tombol button1 dari Form1 public Form2(Button but) // mendapatkan referensi ke tombol dalam variabel but ( but1 = but ; // sekarang but1 akan menjadi tautan ke button1 InitializeComponent(); ) private void button1_Click(pengirim objek, EventArgs e) ( but1.Text = "test"; // ubah teks pada tombol button1 dari Form1 ) ) )

cara ke-3. Akses ke seluruh formulir induk.

Untuk melakukan ini, kita perlu membuat perubahan pada beberapa file, tetapi pada saat yang sama kita akan memiliki akses ke semua elemen formulir induk dan kita tidak perlu meneruskan tautan ke setiap elemen, seperti pada metode pertama.

Langkah 1. Dalam file Program.cs buat variabel publik f1 (baris 5).

Namespace WindowsApplication1 ( static class Program ( public static Form1 f1; // variabel yang akan berisi referensi ke Form1 static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1() ) ; ) ) )

Langkah 2 Kita buka Form1.Designer.cs dan di dalamnya, untuk elemen yang perlu diakses dari bentuk lain, kita ubah pribadi pada publik. Sebagai contoh, mari buat tombol button1 tersedia untuk perubahan pada Form1.

Public System.Windows.Forms.Button button1; // diubah privat menjadi publik

Langkah 3. Saat membuat formulir Form1, kami menetapkan variabel f1 referensi ke formulir ini (baris 7)

Namespace WindowsApplication1 ( public partial class Form1: Form ( public Form1() ( Program.f1 = this; // sekarang f1 akan menjadi referensi untuk form Form1 InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Form2 frm = new Form2(); frm.ShowDialog(); ) ) )

Langkah 4 Sekarang, dari formulir apa pun atau dari kelas apa pun, Anda dapat mengakses elemen button1 yang terletak di Form1 seperti ini: Program.f1.button1. Misalnya, mari buat tombol di Form2 ubah teks tombol menjadi Form1:

Namespace WindowsApplication1 ( public partial class Form2: Form ( public Form2() ( InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Program.f1.button1.Text = "test"; // Mengubah teks pada tombol formulir Form1 ) ) )

Masalah yang dibahas dalam artikel ini lebih terkait dengan topik arsitektur aplikasi, dan bukan masalah spesifik yang dibahas. Meneruskan data dari satu formulir ke formulir lainnya tidaklah sulit sama sekali. Untuk melakukan ini, cukup membuat kontrol, data yang ingin kami terima, buka, yaitu menandainya dengan pengubah publik. Juga, opsi lain dimungkinkan. Misalnya, dalam bentuk pertama, kita membuat objek bentuk kedua dengan meneruskan referensi ke diri kita sendiri ke konstruktor, yaitu dengan meneruskan dari bentuk pertama ke bentuk kedua referensi ke bentuk pertama.
SecondForm secondForm = new SecondForm(ini);
Biasanya, sebelum melakukan ini, Anda harus berhati-hati dalam membuat konstruktor bentuk kedua yang berlebihan.

Dan metode ini cukup umum. Namun dengan kesederhanaannya membawa banyak potensi masalah, yang utamanya adalah pelanggaran prinsip enkapsulasi. Singkatnya, bentuk kedua seharusnya tidak tahu apa-apa tentang keberadaan yang pertama dan, terlebih lagi, tidak boleh mempengaruhinya.

Solusi untuk masalah ini cukup sederhana. Mari kita langsung ke kodenya. Di perancang, kami membuat formulir utama (itu akan diluncurkan saat aplikasi dimulai). Mari kita menempatkan satu kolom tulisan, label Dan tombol.

Saat tombol diklik, formulir kedua akan terbuka dan teks dari bidang teks formulir utama akan dipindahkan ke bidang teks formulir kedua. Awalnya, bentuk kedua terlihat seperti ini:

Seperti yang pertama, ia memiliki kontrol yang sama. Kami tidak membutuhkan lebih banyak. Titik masuk aplikasi meluncurkan formulir utama:

Menggunakan Sistem; menggunakan System.Collections.Generic; menggunakan System.Linq; menggunakan System.Windows.Forms; namespace From1FormTo2 ( kelas statis Program ( // Titik masuk utama untuk aplikasi. static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); ) ) )

Kode formulir utama terlihat seperti ini:

Menggunakan Sistem; menggunakan System.Collections.Generic; menggunakan System.ComponentModel; menggunakan Sistem.Data; menggunakan System.Drawing; menggunakan System.Linq; menggunakan Sistem.Teks; menggunakan System.Windows.Forms; namespace From1FormTo2 ( public partial class MainForm: Form ( //form kedua SecondForm secondForm; //constructor public MainForm() ( InitializeComponent(); ) //data transfer event handler //dari form utama ke private kedua void btn_mainForm_Click(objek pengirim, EventArgs e) ( secondForm = new SecondForm(tb_mainForm.Text.Trim()); secondForm.ShowDialog(); if (secondForm.DialogResult == DialogResult.OK) tb_mainForm.Text = secondForm.ReturnData(); ) ) )

Karenanya, jangan lupa untuk menghubungkan tombol ke acara tersebut Klik. Di sini, di kelas formulir utama, ada bidang SecondForm secondForm A yang mewakili objek bentuk kedua. Saat Anda mengklik tombol "Kirim", formulir kedua dibuat (konstruktor yang kelebihan beban dipanggil, kami akan membuatnya nanti) dan diluncurkan dengan metode ShowDialog(). Dalam hal ini, metode ini cocok untuk kita. Apalagi setelah itu kita pasti akan mengecek apakah kita belum menutup form kedua, tapi mengklik tombolnya. Jika pada formulir kedua tombol diklik, maka formulir pertama harus menerima data dari formulir kedua. Ini dilakukan dengan memanggil metode ReturnData() dalam bentuk kedua.

Sekarang bagian yang paling menarik adalah kode bentuk kedua:

Menggunakan Sistem; menggunakan System.Collections.Generic; menggunakan System.ComponentModel; menggunakan Sistem.Data; menggunakan System.Drawing; menggunakan System.Linq; menggunakan Sistem.Teks; menggunakan System.Windows.Forms; namespace From1FormTo2 ( public partial class SecondForm: Form ( //overloaded constructor public SecondForm(string data) ( InitializeComponent(); tb_secondForm.Text = data; ) //data transfer event handler //dari form kedua ke form utama private void btn_secondForm_Click (pengirim objek, EventArgs e) ( this.DialogResult = DialogResult.OK; ) //metode publik untuk mengakses //bidang teks formulir ini public string ReturnData() ( return (tb_secondForm.Text.Trim()); ) ) )

Seperti yang Anda lihat, ada satu kelebihan konstruktor yang menerima tipe string. Ingatlah bahwa kami mencoba mengirimkan teks dari TextBox. Di konstruktor, komponen dijadwalkan untuk diinisialisasi dan bidang teks diatur ke nilai yang diteruskan dari formulir pertama. Selanjutnya, berlangganan acara tersebut Klik untuk tombol bentuk kedua, kami telah membuat penangan btn_secondForm_Click, yang mensimulasikan pengoperasian tombol "Oke" dari kotak dialog apa pun. Jadi, dengan mengklik tombol "Kirim" (dari formulir kedua), kami menjalankan kondisi tersebut

(bentukkedua .DialogResult == DialogResult .OK)

Bentuk pertama, oleh karena itu, memanggil metode secondForm.ReturnData(), kami menyetel bidang teks formulir pertama ke nilai bidang teks formulir kedua.

Pekerjaan metode ini Saya pikir tidak perlu penjelasan lebih lanjut. Itu hanya mengembalikan teks dari satu bidang teks sekaligus menjaganya tetap pribadi.

Hasilnya, kami mentransfer data ke bentuk kedua dari yang pertama dan dari yang kedua ke yang pertama tanpa melanggar prinsip enkapsulasi.

Coba masukkan teks "aaa" di bidang teks formulir pertama dan klik tombolnya. Anda akan melihat dalam bentuk kedua yang dibuka teks ini di bidang teksnya. Coba ubah teks menjadi "aaa ppp" dan klik tombolnya. Anda akan melihat caranya setelah menutup formulir kedua teks yang diberikan akan ditampilkan di bidang teks formulir utama.

Sekarang, menurut saya, Anda akan lebih tepat melakukan transfer data antar formulir. Pada artikel selanjutnya, kita akan berbicara tentang bagaimana dalam aplikasi ASP.NET.

Pembaruan terakhir: 31.10.2015

Untuk menambahkan formulir lain ke proyek, klik nama proyek di jendela Solution Explorer (Solution Explorer) klik kanan mouse dan pilih Add(Add)->Windows Form...

Mari beri nama pada formulir baru, misalnya, Form2.cs:

Jadi, kami telah menambahkan formulir kedua ke proyek. Sekarang mari kita coba menerapkan interaksi antara kedua bentuk tersebut. Katakanlah formulir pertama akan memanggil formulir kedua saat tombol diklik. Pertama, mari tambahkan tombol ke formulir pertama Form1 dan klik dua kali pada tombol untuk membuka file kode. Jadi, kita akan masuk ke event handler klik tombol, yang dibuat secara default setelah mengklik dua kali tombol:

Private void button1_Click(pengirim objek, EventArgs e) ( )

Sekarang mari tambahkan kode panggilan dari bentuk kedua ke dalamnya. Bentuk kedua kita disebut Form2, jadi pertama-tama kita membuat objek dari kelas ini, lalu kita memanggil metode Show untuk menampilkannya di layar:

Private void button1_Click(pengirim objek, EventArgs e) ( Form2 newForm = new Form2(); newForm.Show(); )

Sekarang mari kita lakukan sebaliknya - sehingga bentuk kedua memengaruhi bentuk pertama. Sedangkan bentuk kedua tidak tahu tentang keberadaan yang pertama. Untuk memperbaikinya, Anda perlu mentransfer informasi tentang formulir pertama ke formulir kedua. Untuk melakukan ini, kami akan menggunakan tautan ke formulir di konstruktor.

Jadi mari beralih ke formulir kedua dan beralih ke kodenya - klik kanan pada formulir dan pilih Lihat Kode (Lihat kode). Meskipun kosong dan hanya berisi konstruktor. Karena C# mendukung kelebihan metode, kita dapat membuat banyak metode dan konstruktor dengan parameter berbeda dan memanggil salah satunya tergantung pada situasinya. Jadi, mari kita ubah file kode dari bentuk kedua sebagai berikut:

Menggunakan Sistem; menggunakan System.Collections.Generic; menggunakan System.ComponentModel; menggunakan Sistem.Data; menggunakan System.Drawing; menggunakan System.Linq; menggunakan Sistem.Teks; menggunakan System.Threading.Tasks; menggunakan System.Windows.Forms; namespace HelloApp ( public partial class Form2: Form ( public Form2() ( InitializeComponent(); ) public Form2(Form1 f) ( InitializeComponent(); f.BackColor = Color.Yellow; ) ) )

Faktanya, kami baru saja menambahkan konstruktor Form2(Form1 f) publik baru di sini, di mana kami mendapatkan formulir pertama dan mengatur latar belakangnya menjadi kuning. Sekarang mari kita pergi ke kode bentuk pertama, di mana kita memanggil bentuk kedua dan mengubahnya sebagai berikut:

Private void button1_Click(pengirim objek, EventArgs e) ( Form2 newForm = new Form2(this); newForm.Show(); )

Karena dalam hal ini kata kunci ini mewakili referensi ke objek saat ini - objek Form1, lalu saat membuat formulir kedua, ia akan menerimanya (tautan) dan mengelola formulir pertama melaluinya.

Nah, setelah mengklik tombol tersebut, kita akan membuat form kedua, yang akan langsung mengubah warna form pertama.

Kami juga dapat membuat objek untuk formulir saat ini:

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

Saat bekerja dengan berbagai formulir, perlu diingat bahwa salah satunya adalah yang utama - yang diluncurkan pertama kali di file Program.cs. Jika kita membuka banyak formulir pada saat yang sama, maka ketika yang utama ditutup, seluruh aplikasi ditutup, dan dengan itu semua formulir lainnya.



Memuat...
Atas