การเปิดแบบฟอร์มอื่นในค. การเปิดแบบฟอร์มที่สองและส่งข้อมูลไปยังแบบฟอร์มหลัก

ติดตาม
เข้าร่วมชุมชน "shango.ru"!
ติดต่อกับ:

วันนี้ฉันต้องการพูดคุยเกี่ยวกับวิธีสร้างโครงการ Windows Forms ใน C ++ ใน Visual Studio 2013 IDE ความจริงก็คือตั้งแต่ VS 2012 รายการ Windows Forms Application จะถูกลบออกจากรายการโครงการที่สามารถสร้างได้ ตอนนี้ฉันกำลังพูดถึงโปรเจ็กต์ใน C++ คุณสามารถสร้างโปรเจ็กต์ดังกล่าวใน C# ได้โดยเลือกรายการที่เหมาะสมในส่วนสำหรับโปรเจ็กต์ที่สร้างขึ้น อย่างไรก็ตาม การที่ไม่สามารถเลือกโครงการดังกล่าวจากรายการได้ไม่ได้หมายความว่าคุณไม่สามารถสร้างโครงการด้วยตนเองได้ นี่คือสิ่งที่ฉันต้องการพูดถึงในบทความนี้

สิ่งแรกที่คุณต้องทำคือเปิด Visual Studio เมื่อ VS เปิดตัวแล้ว ให้คลิก File > New > Project

หลังจากนี้ หน้าต่างจะเปิดขึ้นเพื่อขอให้คุณเลือกประเภทโครงการ เราจำเป็นต้องเลือกส่วนย่อย CLR ในส่วน Visual C++ และเลือก Blank CLR Project

เมื่อสร้างโปรเจ็กต์แล้ว ใน Solution Explorer ให้คลิกขวาที่โปรเจ็กต์ที่สร้างขึ้น ในเมนูบริบทที่เปิดขึ้น ให้เลือกเพิ่ม > สร้างองค์ประกอบ และในเมนูที่เปิดขึ้น ในส่วน UI ให้เลือก Windows Forms

เมื่อเพิ่มแบบฟอร์มแล้ว ให้เลือกไฟล์ MyForm.cpp ใน Solution Explorer แท็บใหม่จะเปิดขึ้นต่อหน้าคุณพร้อมกับโค้ดบรรทัดเดียว:

#รวม "MyForm.h"

เราจำเป็นต้องเพิ่มรหัสต่อไปนี้ในไฟล์นี้:

การใช้ระบบเนมสเปซ ใช้เนมสเปซ System::Windows::Forms; เป็นโมฆะหลัก (array ^ args) ( Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Project1::MyForm form; Application::Run(%form); )

หลังจากนั้นในคุณสมบัติของโครงการ เลือกส่วนย่อย ระบบส่วน Linker และในบรรทัด Subsystem จากเมนูแบบเลื่อนลง ให้เลือก Windows (/SUBSYSTEM:WINDOWS) แล้วคลิก Apply

โดยไม่ต้องปิดหน้าต่างคุณสมบัติโครงการ ให้ไปที่ส่วนย่อยขั้นสูงและในบรรทัด ทางเข้าพวกเราเขียน หลักจากนั้นกดปุ่ม ตกลง.
เป็นอันเสร็จสิ้นการตั้งค่าโปรเจ็กต์ หากต้องการแก้ไขรูปลักษณ์ของแบบฟอร์ม คุณต้องไปที่แท็บ MyForm.h [Designer] โดยดับเบิลคลิกที่ไฟล์ MyForm.h ใน Solution Explorer

แม้ว่าความคิดเห็นของฉันเกี่ยวกับ Visual Studio ของ Microsoft จะยังคงเหมือนเดิม แต่บางครั้งคุณต้องทำอะไรบางอย่างกับมัน หากเราตกลงกับความจริงที่ว่าเราเขียน ไม่ใช่ในภาษา C++ แต่ในสิ่งที่เรียกว่า C++/CLI การทำงานกับองค์ประกอบภาพที่คุ้นเคยจะไม่แตกต่างจากสภาพแวดล้อม Borland เดียวกันมากนัก แต่สามารถสร้างปัญหาได้เมื่อเทียบกับ Builder ลองพิจารณาสถานการณ์ทั่วไป 3 สถานการณ์ในการทำงานกับแอปพลิเคชันที่มีมากกว่าหนึ่งรูปแบบ สภาพแวดล้อมตัวอย่างคือ Visual C++ 2010 Express ฟรี โดยถือว่าแบบฟอร์มหลักมีชื่อเริ่มต้นคือ Form1

ตัวอย่างของการสร้างและการเรียกแบบฟอร์มโดยทางโปรแกรม

รหัสนี้สามารถดำเนินการได้ เช่น โดยการคลิกปุ่มในรูปแบบหลัก Form1

แบบฟอร์ม ^ form2 = แบบฟอร์ม gcnew (); ปุ่ม ^ button2 = ปุ่ม gcnew (); button2->ข้อความ = L"ตกลง"; ปุ่ม 2 -> ตำแหน่ง = จุด (10,10); form2->Text = L"หน้าต่างของฉัน"; form2->HelpButton = จริง; form2->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog; form2->StartPosition = FormStartPosition::CenterScreen; form2->การควบคุม->เพิ่ม(button2); form2->ShowDialog();

หากต้องการเพิ่มตัวจัดการการคลิกสำหรับปุ่มที่สร้างโดยทางโปรแกรม button2 เพียงเขียนไว้หน้าบรรทัดสุดท้ายของโค้ด:

Button2->คลิก += gcnew System::EventHandler(นี่ &Form1::button2_Click);

ก่อนที่จะเรียกเมธอด form2->ShowDialog() หรือ form2->Show()

ในกรณีนี้ รหัสตัวจัดการจะอยู่ในโมดูลปัจจุบัน Form1.h:

ส่วนตัว: System::Void button2_Click (System::Object^ ผู้ส่ง System::EventArgs^ e) ( MessageBox::Show("Here"); )

เรียกแบบฟอร์มอื่นจากแบบฟอร์มหลัก

ในเมนู เลือกโครงการ - เพิ่มองค์ประกอบใหม่ - แบบฟอร์ม - ชื่อ Form2

มาเพิ่มโอเปอเรเตอร์กัน

#รวม "Form2.h"

ก่อนเนมสเปซแรกใน Form1.h (นั่นคือ ที่จุดเริ่มต้นของไฟล์)

เรามารวมตัวชี้ไปยังอินสแตนซ์ของคลาสในส่วนสาธารณะของคลาส Form1:

แบบฟอร์ม2^F2;

มาเพิ่มโค้ดที่เราต้องสร้างและเรียกแบบฟอร์มที่สอง:

F2=gcnewForm2(); F2->แสดง();

หากต้องการลบแบบฟอร์มที่สองโดยทางโปรแกรม รหัสต่อไปนี้จะเหมาะสม:

ลบ F2;

ควรสังเกตว่าตัวชี้จะเก็บที่อยู่ของแบบฟอร์มเดียวเท่านั้น ซึ่งเป็นแบบฟอร์มที่สร้างขึ้นล่าสุด หากเราสร้างหลายฟอร์มตามลำดับโดยใช้โค้ดนี้ เฉพาะอันสุดท้ายเท่านั้นที่จะถูกลบ หรือลองใช้อาร์เรย์รูปร่างที่อธิบายไว้ด้านล่าง

มาอธิบายข้อมูลที่จำเป็นในรูปแบบคลาส Form1 (นี่คือชื่อและเนมสเปซของโครงการ Tabulator หากจำเป็น ให้แทนที่ด้วยของคุณเอง):

ค่าคงที่ int MAX_FORMS = 100; //จำนวนแบบฟอร์มสูงสุด int FormCount; //สร้างอาร์เรย์ตัวนับ ^F2; //ชี้ไปที่อาร์เรย์ของแบบฟอร์ม

จากนั้นเราเริ่มต้นข้อมูลโดยใช้เหตุการณ์ Load ของแบบฟอร์มหลัก:

แบบฟอร์มนับ=0; F2 = อาร์เรย์ gcnew (MAX_FORMS);

จากนั้นเราจะนำโค้ดไปสร้างแบบฟอร์มถัดไป

ถ้า(FormCount แสดง(); ) else MessageBox::Show("มีรูปแบบมากเกินไป!");

และการกำจัด:

ถ้า (FormCount) ( ลบ F2; FormCount--; )

หากเราต้องการสร้างแบบฟอร์มลูกโดยไม่แยกจากกัน แต่อยู่ในแบบฟอร์มหลัก ดังนั้นในคุณสมบัติของ Form1 เราต้องระบุว่าเป็น "บรรพบุรุษ" (ตั้งค่าคุณสมบัติ IsMdiParent = true) และก่อนที่จะแสดงแบบฟอร์มลูกโดยใช้ ตัวดำเนินการ F2->Show() ทำเครื่องหมายเป็นรายการย่อย Form1:

F2->MdiParent = นี่;

เรียกวิธีแบบฟอร์มหลักจากแบบฟอร์มลูก

เราแทบจะไม่สามารถทำได้โดยไม่ต้องใช้ไฟล์ .cpp ซึ่งถือว่าไม่เลว - โดยทั่วไปการเขียนโค้ดในไฟล์ .h จะทำให้ระบบ C ที่ถูกต้องเสียหาย :)

มาอธิบายกระบวนการทีละขั้นตอนกัน

1) มี 2 รูปแบบ - Form1 และ Form2 บน Form1 จะมีปุ่ม (button1 จะเปิดแบบฟอร์มที่สอง) และ Label (label1 ที่นี่เราจะเปลี่ยนข้อความ) บน Form2 - button1 เมื่อคลิก ข้อความใน label1 จะเปลี่ยน

2) เนื่องจากเราจำเป็นต้องเข้าถึงแบบฟอร์มที่สองจากแบบฟอร์มแรก และจากแบบฟอร์มที่สองไปยังแบบฟอร์มแรก ปัญหาของการอ้างอิงโยงจะเกิดขึ้น (เมื่อ Form1.h อ้างถึง Form2.h ซึ่งในทางกลับกันจะอ้างถึงอีกครั้ง เป็น Form1.h) เพื่อหลีกเลี่ยงปัญหานี้ เราจะย้ายโค้ดของแบบฟอร์มแรก (Form1) ซึ่งจะสามารถเข้าถึงแบบฟอร์มที่สอง (Form2) จากไฟล์ .h ไปยังไฟล์ .cpp ดังนั้นคุณต้องสร้างไฟล์ Form1.cpp

3) ประกาศวิธีการ Set สาธารณะใน Form1.h เพื่อให้คุณสามารถเปลี่ยนข้อความของ label1 (สามารถเขียนโค้ดที่ส่วนท้ายของไฟล์ หลังจาก #pragma endregion):

สาธารณะ: ชุดโมฆะ (สตริง ^ ข้อความ) ( label1->Text = text; )

4) ในไฟล์ Form2.h เรารวม Form1.h (ที่จุดเริ่มต้น):

#รวม "Form1.h"

และสร้าง Constructor ที่จะยอมรับและบันทึกลิงก์ไปยังแบบฟอร์มแรกเพื่อใช้ต่อไป:

Form2(Form1^ parent) ( InitializeComponent(); parentForm = parent; ) //คุณสามารถเขียนลิงค์ด้านล่างได้ทันที: private: Form1^ parentForm;

5) เมื่อคลิกปุ่มใน Form2 เราจะเรียกวิธี Set ของแบบฟอร์มหลัก:

ส่วนตัว: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) ( parentForm->Set("hello from form2"); parentForm->Show(); this->Hide(); )

6) ยังคงเปิดแบบฟอร์มที่สองในรูปแบบแรก ในการดำเนินการนี้ เราย้ายตัวจัดการการคลิกปุ่มจาก Form1.h ไปที่ Form1.cpp และในไฟล์ .h เราจะเหลือเพียงการประกาศเท่านั้น

คำถามที่กล่าวถึงในบทความนี้มีแนวโน้มที่จะเกี่ยวข้องกับหัวข้อการสร้างสถาปัตยกรรมแอปพลิเคชันมากกว่า และไม่เฉพาะเจาะจงกับปัญหาที่กำลังพิจารณา การถ่ายโอนข้อมูลจากแบบฟอร์มหนึ่งไปยังอีกรูปแบบหนึ่งนั้นไม่ใช่เรื่องยากเลย ในการดำเนินการนี้ ก็เพียงพอที่จะทำให้การควบคุมที่มีข้อมูลที่เราต้องการได้รับเปิดขึ้น นั่นคือ ทำเครื่องหมายด้วยตัวแก้ไขสาธารณะ นอกจากนี้ยังเป็นไปได้อีกทางเลือกหนึ่ง ตัวอย่างเช่น ในรูปแบบแรก เราสร้างอ็อบเจ็กต์ของรูปแบบที่สองโดยส่งการอ้างอิงถึงตัวเราเองไปยังตัวสร้าง นั่นคือโดยส่งการอ้างอิงไปยังรูปแบบแรกจากแบบฟอร์มแรกไปยังรูปแบบที่สอง
SecondForm SecondForm = ใหม่ SecondForm(นี้);
โดยปกติแล้ว ก่อนที่จะทำเช่นนี้ คุณควรดูแลการสร้างโอเวอร์โหลดให้กับคอนสตรัคเตอร์ของแบบฟอร์มที่สอง

และวิธีนี้ค่อนข้างธรรมดา อย่างไรก็ตาม ด้วยความเรียบง่าย จึงมีปัญหาที่อาจเกิดขึ้นมากมาย ปัญหาหลักคือการละเมิดหลักการห่อหุ้ม กล่าวอีกนัยหนึ่งรูปแบบที่สองไม่ควรรู้อะไรเกี่ยวกับการมีอยู่ของรูปแบบแรกและยิ่งกว่านั้นก็ไม่ควรมีอิทธิพลต่อมัน

วิธีแก้ปัญหานี้ค่อนข้างง่าย ลองดูที่รหัสโดยตรง ในตัวออกแบบ เราสร้างแบบฟอร์มหลัก (ซึ่งจะถูกเปิดใช้งานเมื่อแอปพลิเคชันเริ่มทำงาน) เอาอันหนึ่งมาใส่กัน กล่องข้อความ, ฉลากและ ปุ่ม.

เมื่อคลิกที่ปุ่ม แบบฟอร์มที่สองจะเปิดขึ้น และข้อความจากช่องข้อความของแบบฟอร์มหลักจะถูกโอนไปยังช่องข้อความของแบบฟอร์มที่สอง ในตอนแรกแบบฟอร์มที่สองจะมีลักษณะดังนี้:

คล้ายกับอันแรก แต่ก็มีการควบคุมเหมือนกัน เราไม่ต้องการอีกต่อไป จุดเข้าแอปพลิเคชันเปิดตัวแบบฟอร์มหลัก:

การใช้ระบบ; ใช้ System.Collections.Generic; ใช้ System.Linq; โดยใช้ System.Windows.Forms; เนมสเปซ From1FormTo2 ( โปรแกรมคลาสคงที่ ( // จุดเข้าหลักสำหรับแอปพลิเคชัน static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); ) ) )

โค้ดฟอร์มหลักมีลักษณะดังนี้:

การใช้ระบบ; ใช้ System.Collections.Generic; โดยใช้ System.ComponentModel; ใช้ System.Data; โดยใช้ระบบการวาดภาพ; ใช้ System.Linq; ใช้ System.Text; โดยใช้ System.Windows.Forms; เนมสเปซ From1FormTo2 ( MainForm คลาสบางส่วนสาธารณะ: แบบฟอร์ม ( // รูปแบบที่สอง SecondForm SecondForm; // ตัวสร้าง MainForm สาธารณะ () ( InitializeComponent (); ) // ตัวจัดการเหตุการณ์การถ่ายโอนข้อมูล // จากแบบฟอร์มหลักไปยังโมฆะส่วนตัวที่สอง btn_mainForm_Click (วัตถุ ผู้ส่ง EventArgs e) ( SecondForm = new SecondForm(tb_mainForm.Text.Trim()); SecondForm.ShowDialog(); if (secondForm.DialogResult == DialogResult.OK) tb_mainForm.Text = SecondForm.ReturnData(); ) ) )

ดังนั้นอย่าลืมเชื่อมต่อปุ่มเข้ากับกิจกรรมด้วย คลิก. ที่นี่ในคลาสฟอร์มหลักจะมีฟิลด์ แบบฟอร์มที่สอง แบบฟอร์มที่สองเป็นตัวแทนของวัตถุรูปแบบที่สอง เมื่อคุณคลิกที่ปุ่ม "ส่ง" แบบฟอร์มที่สองจะถูกสร้างขึ้น (เรียกว่าคอนสตรัคเตอร์ที่โอเวอร์โหลดเราจะสร้างมันขึ้นมาในภายหลัง) และเปิดใช้งานโดยใช้วิธีการ แสดงกล่องโต้ตอบ(). กรณีนี้วิธีนี้เหมาะกับเราครับ นอกจากนี้ หลังจากนี้เราจะตรวจสอบให้แน่ใจว่าแบบฟอร์มที่สองปิดอยู่หรือไม่ แต่คลิกที่ปุ่มแล้ว หากมีการคลิกปุ่มบนแบบฟอร์มที่สอง แบบฟอร์มแรกควรยอมรับข้อมูลจากแบบฟอร์มที่สอง สิ่งนี้เกิดขึ้นโดยการเรียกเมธอด ข้อมูลส่งคืน()ในรูปแบบที่สอง

ตอนนี้ส่วนที่น่าสนใจที่สุดคือโค้ดของแบบฟอร์มที่สอง:

การใช้ระบบ; ใช้ System.Collections.Generic; โดยใช้ System.ComponentModel; ใช้ System.Data; โดยใช้ระบบการวาดภาพ; ใช้ System.Linq; ใช้ System.Text; โดยใช้ System.Windows.Forms; เนมสเปซ From1FormTo2 ( สาธารณะบางส่วนคลาส SecondForm: แบบฟอร์ม ( //ตัวสร้างมากเกินไป สาธารณะ SecondForm(ข้อมูลสตริง) ( InitializeComponent(); tb_secondForm.Text = data; ) // ตัวจัดการเหตุการณ์การถ่ายโอนข้อมูล // จากแบบฟอร์มที่สองไปยังโมฆะส่วนตัวหลัก btn_secondForm_Click (ผู้ส่งวัตถุ EventArgs e) ( this.DialogResult = DialogResult.OK; ) // วิธีการสาธารณะสำหรับการเข้าถึง // ช่องข้อความของแบบฟอร์มนี้ สตริงสาธารณะ ReturnData() ( return (tb_secondForm.Text.Trim()); ) ) )

อย่างที่คุณเห็น มีคอนสตรัคเตอร์โอเวอร์โหลดตัวเดียวที่ยอมรับประเภทสตริง โปรดจำไว้ว่าเรากำลังพยายามถ่ายโอนข้อความจากกล่องข้อความ ใน Constructor ส่วนประกอบจะถูกกำหนดให้เริ่มต้นและข้อความของฟิลด์ข้อความจะถูกตั้งค่าเป็นค่าที่ส่งจากแบบฟอร์มแรก ต่อไปโดยสมัครสมาชิกกิจกรรม คลิกสำหรับปุ่มของแบบฟอร์มที่สอง เราได้สร้างตัวจัดการขึ้นมา btn_secondForm_คลิกซึ่งจำลองการทำงานของปุ่ม "ตกลง" ของกล่องโต้ตอบใด ๆ ดังนั้นโดยการคลิกที่ปุ่ม "ส่ง" (ของแบบฟอร์มที่สอง) เราจึงดำเนินการตามเงื่อนไข

(secondForm .DialogResult == DialogResult .OK)

รูปแบบแรกจึงเรียกเมธอด SecondForm.ReturnData()เราตั้งค่าฟิลด์ข้อความของแบบฟอร์มแรกเป็นค่าของฟิลด์ข้อความของแบบฟอร์มที่สอง

ฉันคิดว่าการดำเนินการของวิธีนี้ไม่ต้องการคำอธิบายอีกต่อไป เพียงส่งคืนข้อความจากฟิลด์ข้อความเดียวโดยยังคงความเป็นส่วนตัวไว้

ด้วยเหตุนี้ เราจึงถ่ายโอนข้อมูลไปยังรูปแบบที่สองตั้งแต่รูปแบบแรกและจากรูปแบบที่สองไปยังรูปแบบแรก โดยไม่ละเมิดหลักการของการห่อหุ้ม

ลองป้อนข้อความ "aaa" ลงในช่องข้อความของแบบฟอร์มแรกแล้วคลิกปุ่ม คุณจะเห็นข้อความนี้ในช่องข้อความในรูปแบบที่สองที่เปิดขึ้น ลองเปลี่ยนข้อความเป็น “aaa ppp” แล้วคลิกที่ปุ่ม คุณจะเห็นว่าหลังจากปิดแบบฟอร์มที่สองแล้ว ข้อความนี้จะปรากฏในช่องข้อความของแบบฟอร์มหลักอย่างไร

ตอนนี้ฉันคิดว่าคุณจะสามารถถ่ายโอนข้อมูลระหว่างแบบฟอร์มได้ถูกต้องมากขึ้น ในบทความถัดไปเราจะพูดถึงวิธีการดำเนินการในแอปพลิเคชัน ASP.NET

บางครั้งจำเป็นต้องเข้าถึงองค์ประกอบของแบบฟอร์มหนึ่งจากอีกรูปแบบหนึ่งระหว่างการทำงานของโปรแกรม ตัวอย่างเช่น มีแบบฟอร์ม Form1 จากนั้นเราเปิด Form2 อีกอัน และตอนนี้เมื่อทำงานใน Form2 เราจำเป็นต้องเข้าถึงองค์ประกอบของแบบฟอร์มหลัก Form1 ฉันพบหลายวิธีในการทำเช่นนี้

วิธีที่ 1. การส่งผ่านการอ้างอิงไปยังตัวแปรสาธารณะ

Namespace WindowsApplication1 (คลาสสาธารณะบางส่วน Form1: แบบฟอร์ม (สาธารณะ Form1() ( InitializeComponent(); ) โมฆะส่วนตัว button1_Click (ผู้ส่งวัตถุ EventArgs e) ( Form2 frm = new Form2(); frm.but1 = this.button1; // ส่ง ลิงค์ไปที่ปุ่มในรูปแบบ Form2 frm.ShowDialog(); ) ) )

ใน Form2 ตัวแปรที่ลิงก์ถูกส่งผ่านจะสอดคล้องกับปุ่ม 1 จาก Form1

Namespace WindowsApplication1 ( คลาสสาธารณะบางส่วน Form2: ฟอร์ม ( ปุ่มสาธารณะ but1; // ตัวแปรนี้จะมีลิงก์ไปยังปุ่ม 1 จากฟอร์มสาธารณะ Form1() ( InitializeComponent(); ) โมฆะส่วนตัว button1_Click(ผู้ส่งวัตถุ, EventArgs e) ( but1. ข้อความ = "test"; // เปลี่ยนข้อความบนปุ่ม button1 ของ Form1 ) ) )

วิธีที่ 2. การส่งลิงก์ไปยังแบบฟอร์มลูก

สาระสำคัญจะใกล้เคียงกันในวิธีที่ 1 เมื่อเปิด Form2 เราจะส่งลิงก์ไปยังองค์ประกอบที่เราวางแผนจะเปลี่ยนแปลงในภายหลังเข้าไป

Namespace WindowsApplication1 ( คลาสสาธารณะบางส่วน Form1: ฟอร์ม ( public Form1() ( InitializeComponent(); ) โมฆะส่วนตัว button1_Click(ผู้ส่งวัตถุ, EventArgs e) ( Form2 frm = new Form2(this.button1); // ส่งลิงก์ไปยังปุ่ม เป็นรูปแบบ Form2 frm.ShowDialog(); ) ) )

ตอนนี้ใน Form2 เราจำเป็นต้องสร้างตัวแปรที่จะมีลิงก์ไปยังปุ่มนี้ และเราจะเข้าถึงปุ่มบน Form1 (บรรทัดที่ 5,7,9 และ 15) ผ่านตัวแปรนั้น

Namespace WindowsApplication1 ( สาธารณะบางส่วนคลาส Form2: แบบฟอร์ม ( ปุ่มส่วนตัว but1; // ตัวแปรนี้จะมีลิงก์ไปยังปุ่ม button1 จากแบบฟอร์ม Form1 สาธารณะ Form2(ปุ่ม แต่) // รับลิงก์ไปยังปุ่มในตัวแปร แต่ ( but1 = แต่; // ตอนนี้ but1 จะเป็นลิงค์ไปยังปุ่ม button1 InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( but1.Text = "test"; // เปลี่ยนข้อความบนปุ่ม button1 ของ Form1 ) ) )

วิธีที่ 3. เข้าถึงแบบฟอร์มผู้ปกครองทั้งหมด

ในการดำเนินการนี้ คุณต้องทำการเปลี่ยนแปลงในหลายไฟล์ แต่ในขณะเดียวกัน เราจะสามารถเข้าถึงองค์ประกอบทั้งหมดของแบบฟอร์มหลัก และไม่จำเป็นต้องส่งลิงก์ไปยังแต่ละองค์ประกอบ เช่นเดียวกับในวิธีที่ 1

ขั้นตอนที่ 1.ในไฟล์ โปรแกรม.csสร้างตัวแปรสาธารณะ f1 (บรรทัดที่ 5)

Namespace WindowsApplication1 ( โปรแกรมคลาสคงที่ ( public static Form1 f1; // ตัวแปรที่จะมีลิงก์ไปยังฟอร์ม Form1 static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1( ) ); ) ) )

ขั้นตอนที่ 2.กำลังเปิด Form1.Designer.csและในนั้นสำหรับองค์ประกอบที่ต้องเข้าถึงจากรูปแบบอื่นเราเปลี่ยนแปลง ส่วนตัวบน สาธารณะ. ตัวอย่างเช่น เรามาทำให้ปุ่ม 1 บน Form1 พร้อมใช้งานสำหรับการเปลี่ยนแปลง

ระบบสาธารณะ Windows.Forms ปุ่มปุ่ม 1; // แทนที่ส่วนตัวด้วยสาธารณะ

ขั้นตอนที่ 3. เมื่อสร้าง Form1 เราจะกำหนดลิงก์ให้กับตัวแปร f1 ไปยังแบบฟอร์มนี้ (บรรทัดที่ 7)

Namespace WindowsApplication1 ( public คลาสบางส่วน Form1: Form ( public Form1() ( Program.f1 = this; // ตอนนี้ f1 จะเป็นลิงค์ไปยังฟอร์ม Form1 InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Form2 frm = ใหม่ Form2(); frm.ShowDialog(); ) ) )

ขั้นตอนที่ 4ตอนนี้จากทุกรูปแบบหรือจากคลาสใด ๆ คุณสามารถเข้าถึงองค์ประกอบ button1 ที่อยู่บน Form1 ได้ดังนี้: Program.f1.button1 ตัวอย่างเช่น ให้ปุ่มบน Form2 เปลี่ยนข้อความปุ่มบน Form1:

Namespace WindowsApplication1 ( สาธารณะบางส่วนคลาส Form2: แบบฟอร์ม (สาธารณะ Form2() ( InitializeComponent(); ) โมฆะส่วนตัว button1_Click(ผู้ส่งวัตถุ EventArgs e) ( Program.f1.button1.Text = "test"; // เปลี่ยนข้อความบน ปุ่มแบบฟอร์ม Form1 ) ) )



กลับ

×
เข้าร่วมชุมชน "shango.ru"!
ติดต่อกับ:
ฉันสมัครเป็นสมาชิกชุมชน “shango.ru” แล้ว