한 양식에서 다른 양식을 여는 방법. 양식을 추가합니다. 양식 간의 상호 작용. 양식을 구성하고 프로그래밍 방식으로 호출하는 예

이 기사에서 다루는 질문은 특별히 고려 중인 문제가 아니라 애플리케이션 아키텍처 구축 주제와 관련이 있을 가능성이 높습니다. 한 양식에서 다른 양식으로 데이터를 전송하는 것은 전혀 어렵지 않습니다. 이렇게 하려면 데이터를 얻으려는 컨트롤을 공개하는 것, 즉 public 수정자로 표시하는 것으로 충분합니다. 또한 다른 옵션도 가능합니다. 예를 들어, 첫 번째 폼에서는 우리 자신에 대한 참조를 생성자에 전달하여, 즉 첫 번째 폼에서 두 번째 폼으로 첫 번째 폼에 대한 참조를 전달하여 두 번째 폼의 객체를 생성합니다.
SecondForm secondForm = new SecondForm(this);
당연히 이 작업을 수행하기 전에 두 번째 양식의 생성자에 대한 오버로드 생성을 처리해야 합니다.

그리고 이 방법은 꽤 흔합니다. 그러나 단순성으로 인해 많은 잠재적인 문제가 발생하며, 가장 큰 문제는 캡슐화 원칙을 위반하는 것입니다. 한마디로, 두 번째 형태는 첫 번째 형태의 존재에 대해 아무것도 몰라야 하며, 더욱이 그것에 영향을 미칠 수 없어야 합니다.

이 문제에 대한 해결책은 매우 간단합니다. 코드를 직접 살펴보겠습니다. 우리는 디자이너에서 만듭니다 주요 형태(애플리케이션이 시작되면 실행됩니다). 하나 넣어보자 텍스트 상자, 상표그리고 단추.

버튼을 클릭하면 두 번째 양식이 열리고 다음의 텍스트가 열립니다. 텍스트 필드기본 양식은 두 번째 양식의 텍스트 필드로 전송됩니다. 처음에 두 번째 형식은 다음과 같습니다.

첫 번째 것과 유사하며 동일한 컨트롤이 있습니다. 더 이상 필요하지 않습니다. 애플리케이션 진입점은 기본 양식을 시작합니다.

시스템 사용; System.Collections.Generic을 사용합니다. System.Linq 사용; System.Windows.Forms 사용; 네임스페이스 From1FormTo2 ( 정적 클래스 Program ( // 애플리케이션의 기본 진입점. static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); ) ) )

기본 양식 코드는 다음과 같습니다.

시스템 사용; System.Collections.Generic을 사용합니다. System.ComponentModel 사용; System.Data 사용; System.드로잉 사용; System.Linq 사용; System.Text 사용; System.Windows.Forms 사용; 네임스페이스 From1FormTo2 ( public 부분 클래스 MainForm: Form ( //두 번째 폼 SecondForm secondForm; //생성자 public MainForm() ( InitializeComponent(); ) //데이터 전송 이벤트 핸들러 //메인 폼에서 두 번째 프라이빗 void btn_mainForm_Click(object 보낸 사람, EventArgs e) ( secondForm = new SecondForm(tb_mainForm.Text.Trim()); secondForm.ShowDialog(); if (secondForm.DialogResult == DialogResult.OK) tb_mainForm.Text = secondForm.ReturnData(); ) ) )

따라서 버튼을 이벤트에 연결하는 것을 잊지 마세요 딸깍 하는 소리. 여기 기본 양식 클래스에는 필드가 있습니다. SecondForm secondForm, 두 번째 양식 객체를 나타냅니다. "제출" 버튼을 클릭하면 두 번째 양식이 생성되고(오버로드된 생성자가 호출되며 나중에 생성하겠습니다) 메소드를 사용하여 실행됩니다. 표시대화상자(). 이런 경우에는 이 방법이 우리에게 적합합니다. 또한 그런 다음 두 번째 양식이 닫혔지만 해당 버튼을 클릭했는지 확인합니다. 두 번째 양식에서 버튼을 클릭하면 첫 번째 양식이 두 번째 양식의 데이터를 받아들여야 합니다. 이는 메소드를 호출하면 발생합니다. 반환데이터()두 번째 형태로.

이제 가장 흥미로운 부분은 두 번째 형식의 코드입니다.

시스템 사용; System.Collections.Generic을 사용합니다. System.ComponentModel 사용; System.Data 사용; System.드로잉 사용; System.Linq 사용; System.Text 사용; System.Windows.Forms 사용; 네임스페이스 From1FormTo2 ( 공용 부분 클래스 SecondForm: Form ( //오버로드된 생성자 public SecondForm(string data) ( InitializeComponent(); tb_secondForm.Text = data; ) //데이터 전송 이벤트 핸들러 //두 번째 폼에서 기본 폼으로 private void btn_secondForm_Click (객체 전송자, EventArgs e) ( this.DialogResult = DialogResult.OK; ) // 공개 방법// 이 양식의 텍스트 필드에 액세스하려면 public string ReturnData() ( return (tb_secondForm.Text.Trim()); ) ) )

보시다시피 문자열 유형을 허용하는 단일 생성자 오버로드가 있습니다. TextBox에서 텍스트를 전송하려고 한다는 점을 기억하세요. 생성자에서 구성 요소는 초기화되도록 예약되고 텍스트 필드의 텍스트는 첫 번째 양식에서 전송된 값으로 설정됩니다. 다음으로 이벤트 응모를 통해 딸깍 하는 소리두 번째 양식의 버튼에 대해 핸들러를 만들었습니다. btn_secondForm_Click, 이는 모든 대화 상자의 "확인" 버튼 작동을 시뮬레이션합니다. 따라서 (두 번째 양식의) "제출" 버튼을 클릭하면 조건이 실행됩니다.

(secondForm .DialogResult == DialogResult .OK)

따라서 첫 번째 형식에서는 메서드를 호출합니다. secondForm.ReturnData(), 첫 번째 양식의 텍스트 필드를 두 번째 양식의 텍스트 필드 값으로 설정합니다.

직업 이 방법, 제 생각에는 더 이상 설명이 필요하지 않습니다. 단일 텍스트 필드의 텍스트를 비공개로 유지하면서 간단히 반환합니다.

그 결과, 우리는 캡슐화 원칙을 위반하지 않고 데이터를 첫 번째 형식에서 두 번째 형식으로, 두 번째 형식에서 첫 번째 형식으로 전송했습니다.

첫 번째 양식의 텍스트 필드에 "aaa"라는 텍스트를 입력하고 버튼을 클릭해 보세요. 열리는 두 번째 양식의 텍스트 필드에 이 텍스트가 표시됩니다. 텍스트를 "aaa ppp"로 변경하고 버튼을 클릭해 보세요. 두 번째 양식을 닫은 후 이 텍스트가 기본 양식의 텍스트 필드에 어떻게 나타나는지 확인할 수 있습니다.

이제 양식 간 데이터 전송이 더욱 정확하게 가능해질 것 같습니다. 다음 기사에서는 ASP.NET 응용 프로그램에서 이를 수행하는 방법에 대해 설명하겠습니다.

최종 업데이트 날짜: 2015년 10월 31일

프로젝트에 다른 양식을 추가하려면 솔루션 탐색기 창에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가->Windows Form...을 선택합니다.

예를 들어, 새 양식에 이름을 지정해 보겠습니다. Form2.cs:

그래서 우리는 프로젝트에 두 번째 양식을 추가했습니다. 이제 두 양식 간의 상호 작용을 구현해 보겠습니다. 버튼을 클릭하면 첫 번째 폼이 두 번째 폼을 호출한다고 가정해 보겠습니다. 먼저 첫 번째 폼인 Form1에 버튼을 추가하고, 버튼을 더블클릭하여 코드 파일로 이동해 보겠습니다. 따라서 버튼을 두 번 클릭한 후 기본적으로 생성되는 버튼의 클릭 이벤트 핸들러로 이동합니다.

Private void 버튼1_Click(객체 전송자, EventArgs e) ( )

이제 두 번째 양식을 호출하기 위한 코드를 추가해 보겠습니다. 두 번째 양식은 Form2이므로 먼저 이 클래스의 개체를 만든 다음 이를 화면에 표시하기 위해 Show 메서드를 호출합니다.

Private void 버튼1_Click(객체 전송자, EventArgs e) ( Form2 newForm = new Form2(); newForm.Show(); )

이제 두 번째 형식이 첫 번째 형식에 영향을 미치도록 반대 작업을 수행해 보겠습니다. 두 번째 형태는 첫 번째 형태의 존재를 알지 못합니다. 이 문제를 해결하려면 첫 번째 양식에 대한 정보를 두 번째 양식으로 전송해야 합니다. 이를 위해 생성자에서 양식에 대한 링크를 전달하는 방법을 사용합니다.

이제 두 번째 양식으로 이동하여 해당 코드로 이동해 보겠습니다. 양식을 마우스 오른쪽 버튼으로 클릭하고 코드 보기를 선택합니다. 현재는 비어 있고 생성자만 포함되어 있습니다. C#은 메서드 오버로드를 지원하므로 다양한 매개 변수를 사용하여 여러 메서드와 생성자를 만들고 상황에 따라 그 중 하나를 호출할 수 있습니다. 따라서 두 번째 양식의 코드 파일을 다음과 같이 변경해 보겠습니다.

시스템 사용; System.Collections.Generic을 사용합니다. System.ComponentModel 사용; System.Data 사용; System.드로잉 사용; System.Linq 사용; System.Text 사용; System.Threading.Tasks 사용; System.Windows.Forms 사용; 네임스페이스 HelloApp ( 공개 부분 클래스 Form2: Form ( 공개 Form2() ( 초기화 구성 요소(); ) 공개 Form2(Form1 f) ( 초기화 구성 요소(); f.BackColor = Color.Yellow; ) ) )

사실 방금 여기에 추가했습니다. 새로운 생성자 public Form2(Form1 f) 여기서는 첫 번째 양식을 가져오고 배경을 노란색으로 설정합니다. 이제 첫 번째 양식의 코드로 이동하여 두 번째 양식을 호출하고 이를 다음과 같이 변경해 보겠습니다.

Private void 버튼1_Click(객체 전송자, EventArgs e) ( Form2 newForm = new Form2(this); newForm.Show(); )

이 경우 키워드 this는 현재 개체(Form1 개체)에 대한 참조를 나타내므로 두 번째 양식을 생성할 때 해당 키워드(링크)를 수신하고 이를 통해 첫 번째 양식을 제어합니다.

이제 버튼을 클릭하면 두 번째 양식이 생성되어 첫 번째 양식의 색상이 즉시 변경됩니다.

현재 형태의 객체를 생성할 수도 있습니다:

Private void 버튼1_Click(객체 전송자, EventArgs e) ( Form1 newForm1 = new Form1(); newForm1.Show(); Form2 newForm2 = new Form2(newForm1); newForm2.Show(); )

여러 양식으로 작업할 때 그 중 하나가 Program.cs 파일에서 먼저 시작되는 기본 양식이라는 점을 고려해야 합니다. 여러 양식이 동시에 열려 있는 경우 기본 양식을 닫으면 전체 애플리케이션이 닫히고 다른 모든 양식도 함께 닫힙니다.

Microsoft의 Visual Studio에 대한 내 의견은 여전히 ​​동일하다는 사실에도 불구하고 때로는 이에 대해 뭔가 조치를 취해야 할 때가 있습니다. 실제로 C++가 아닌 소위 C++/CLI로 작성한다는 사실을 받아들인다면 친숙한 시각적 구성 요소를 사용하여 작업하는 것은 동일한 Borland 환경과 크게 다르지 않을 것입니다. 그러나 Builder와 비교하면 문제가 발생할 수 있습니다. 둘 이상의 양식을 포함하는 응용 프로그램으로 작업하는 3가지 일반적인 상황을 고려해 보겠습니다. 예제 환경은 무료 Visual C++ 2010 Express이며 기본 양식의 기본 이름은 Form1이라고 가정합니다.

양식을 구성하고 프로그래밍 방식으로 호출하는 예

예를 들어, 이 코드는 기본 폼 Form1의 버튼을 클릭하여 실행할 수 있습니다.

Form^form2 = gcnew Form(); 버튼^ 버튼2 = gcnew 버튼(); 버튼2->텍스트 = L"확인"; 버튼2->위치 = 포인트(10,10); form2->Text = L"내 창"; form2->HelpButton = true; form2->FormBorderStyle = 시스템::Windows::Forms::FormBorderStyle::FixedDialog; form2->StartPosition = FormStartPosition::CenterScreen; form2->컨트롤->추가(button2); form2->ShowDialog();

프로그래밍 방식으로 생성된 버튼(button2)에 대한 클릭 핸들러를 추가하려면 코드의 마지막 줄 앞에 다음을 작성하세요.

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

form2->ShowDialog() 또는 form2->Show() 메서드가 호출되기 전입니다.

이 경우 처리기 코드는 현재 모듈 Form1.h에 있습니다.

비공개: System::Void 버튼2_Click(System::Object^ 보낸 사람, System::EventArgs^ e) ( MessageBox::Show("Here"); )

기본 양식에서 다른 양식 호출

메뉴에서 프로젝트 - 추가를 선택하세요. 새로운 요소- 양식 - 이름 Form2

연산자를 추가해보자

#include "Form2.h"

Form1.h의 첫 번째 네임스페이스 앞(즉, 파일의 맨 처음 부분)

Form1 클래스의 공개 섹션에 클래스 인스턴스에 대한 포인터를 포함시켜 보겠습니다.

양식2^F2;

두 번째 양식을 만들고 호출해야 하는 코드를 추가해 보겠습니다.

F2=gcnewForm2(); F2->표시();

두 번째 양식을 프로그래밍 방식으로 삭제하려면 다음 코드가 적합합니다.

F2 삭제;

포인터는 마지막에 생성된 한 가지 형식의 주소만 저장한다는 점에 유의해야 합니다. 이 코드를 사용하여 여러 개의 양식을 순차적으로 생성하면 마지막 양식만 삭제됩니다. 또는 아래 설명된 모양 배열을 사용해 보세요.

양식 클래스 Form1에서 필요한 데이터를 설명하겠습니다(여기서 Tabulator 프로젝트의 이름과 네임스페이스는 필요한 경우 사용자 고유의 이름으로 바꿉니다).

정적 const int MAX_FORMS = 100; //최대 양식 수 int FormCount; //카운터 배열 형성 ^F2; //폼 배열에 대한 포인터

그런 다음 기본 폼의 Load 이벤트를 사용하여 데이터를 초기화합니다.

양식카운트=0; F2 = gcnew 배열 (MAX_FORMS);

그런 다음 코드를 구현하여 다음 양식을 생성하겠습니다.

If(양식 개수 보여주다(); ) else MessageBox::Show("양식이 너무 많습니다!");

그리고 그 제거:

If (FormCount) ( F2 삭제; FormCount--; )

별도로 하위 양식을 생성하지 않고 상위 양식 내부에 하위 양식을 생성하려면 Form1의 속성에서 이것이 "상위"임을 표시해야 하며(IsMdiParent 속성 = true 설정), 다음을 사용하여 하위 양식을 표시하기 전에 F2->Show() 연산자, 하위 Form1로 표시:

F2->MdiParent = 이;

하위 양식에서 상위 양식 메소드 호출

.cpp 파일을 사용하지 않고는 거의 할 수 없습니다. 이는 나쁘지 않습니다. .h 파일에 코드를 작성하면 일반적으로 올바른 C 시스템이 손상됩니다. :)

프로세스를 단계별로 설명하겠습니다.

1) Form1과 Form2의 두 가지 양식이 있습니다. Form1에는 버튼(버튼 1, 두 번째 양식 열기)과 라벨(레이블 1, 여기서 텍스트를 변경함)이 있습니다. Form2 - 버튼1에서 클릭하면 label1의 텍스트가 변경됩니다.

2) 첫 번째 폼에서 두 번째 폼에 접근해야 하고, 두 번째 폼에서 첫 번째 폼까지 접근해야 하므로 상호 참조 문제가 발생합니다(Form1.h가 Form2.h를 참조하고 다시 Form2.h를 참조하는 경우). Form1.h) . 이를 방지하기 위해 두 번째 폼(Form2)에 액세스할 수 있는 첫 번째 폼(Form1)의 코드를 .h 파일에서 .cpp 파일로 이동합니다. 따라서 Form1.cpp 파일을 생성해야 합니다.

3) label1의 텍스트를 변경할 수 있도록 Form1.h에서 공개 Set 메소드를 선언합니다(코드는 파일 끝의 #pragma endregion 뒤에 작성될 수 있음).

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

4) Form2.h 파일에는 Form1.h(시작 부분)가 포함되어 있습니다.

#include "Form1.h"

추가 사용을 위해 첫 번째 양식에 대한 링크를 허용하고 저장하는 생성자를 만듭니다.

Form2(Form1^ parent) ( InitializeComponent(); parentForm = parent; ) //바로 아래에 링크를 작성할 수 있습니다: private: Form1^ parentForm;

5) Form2에서 버튼을 클릭하면 상위 폼의 Set 메서드를 호출합니다.

비공개: System::Void 버튼1_Click(System::Object^ 보낸 사람, System::EventArgs^ e) ( parentForm->Set("hello from form2"); parentForm->Show(); this->Hide(); )

6) 첫 번째 양식에서 두 번째 양식을 열어야합니다. 이를 위해 버튼 클릭 핸들러를 Form1.h에서 Form1.cpp로 이동하고 .h 파일에는 해당 선언만 남겨 둡니다.

때로는 프로그램 실행 중에 한 양식의 요소에 다른 양식의 요소에 액세스해야 하는 경우가 있습니다. 예를 들어 Form1 양식이 있는데 여기에서 또 다른 Form2를 열고 이제 Form2에서 작업하면서 상위 양식 Form1의 요소에 액세스해야 합니다. 나는 이를 수행하는 몇 가지 방법을 찾았습니다.

첫 번째 방법. 공용 변수에 대한 참조 전달.

네임스페이스 WindowsApplication1 ( 공개 부분 클래스 Form1: Form ( 공개 Form1() ( 초기화 구성요소(); ) 비공개 void 버튼1_Click(객체 전송자, EventArgs e) ( Form2 frm = new Form2(); frm.but1 = this.button1; // 보내기 Form2 frm.ShowDialog(); ) ) ) 형식의 버튼에 대한 링크

Form2에서 링크가 전달된 변수는 이제 Form1의 버튼1에 해당합니다.

네임스페이스 WindowsApplication1 ( public 부분 클래스 Form2: Form ( public Button but1; // 이 변수에는 Form1의 버튼1에 대한 링크가 포함됩니다. public Form2() ( InitializeComponent(); ) private void button1_Click(객체 전송자, EventArgs e) ( but1.Text = "test"; // Form1의 버튼1에 있는 텍스트를 변경합니다. ) ) )

두 번째 방법. 하위 양식에 대한 링크를 전달합니다.

본질은 첫 번째 방법과 거의 동일합니다. Form2를 열 때 나중에 변경할 요소에 대한 링크를 전달합니다.

네임스페이스 WindowsApplication1 ( public 부분 클래스 Form1: Form ( public Form1() ( InitializeComponent(); ) private void button1_Click(object sender, EventArgs e) ( Form2 frm = new Form2(this.button1); // 버튼에 링크 전달 Form2 frm.ShowDialog(); ) ) ) 형식으로

이제 Form2에서 이 버튼에 대한 링크를 포함할 변수를 생성해야 하며 이를 통해 Form1의 버튼(5,7,9 및 15행)에 액세스합니다.

네임스페이스 WindowsApplication1 ( public 부분 클래스 Form2: Form ( private Button but1; // 이 변수에는 Form1 양식의 버튼 Button1에 대한 링크가 포함됩니다. public Form2(Button but) // 변수의 버튼에 대한 링크를 가져옵니다. but( but1 = but; // 이제 but1은 버튼 1에 대한 링크가 될 것임. )

세 번째 방법. 전체 상위 양식에 액세스합니다.

이렇게 하려면 여러 파일을 변경해야 하지만 동시에 상위 양식의 모든 요소에 액세스할 수 있으므로 방법 1과 같이 각 요소에 대한 링크를 전달할 필요가 없습니다.

1 단계.파일에 있음 Program.cs공용 변수 f1을 만듭니다(5번째 줄).

네임스페이스 WindowsApplication1 ( static class Program ( public static Form1 f1; // Form1 양식에 대한 링크를 포함할 변수 static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1( ) ); ) ) )

2 단계.열리는 Form1.Designer.cs그리고 그 안에서 다른 양식에서 액세스해야 하는 요소에 대해 다음을 변경합니다. 사적인~에 공공의. 예를 들어 Form1의 버튼1을 변경 가능하게 만들어 보겠습니다.

공용 System.Windows.Forms.Button 버튼1; // 비공개를 공개로 대체

3단계. Form1을 생성할 때 변수 f1에 이 폼에 대한 링크를 할당합니다(7행).

네임스페이스 WindowsApplication1 ( public 부분 클래스 Form1: Form ( public Form1() ( Program.f1 = this; // 이제 f1은 Form1 OriginalizeComponent(); ) 양식에 대한 링크가 됩니다. private void 버튼1_Click(객체 전송자, EventArgs e) ( Form2 frm = new Form2(); frm.ShowDialog(); ) ) )

4단계.이제 모든 양식이나 클래스에서 Program.f1.button1과 같이 Form1에 있는 버튼1 요소에 액세스할 수 있습니다. 예를 들어, Form2의 버튼이 Form1의 버튼 텍스트를 변경하도록 합니다.

네임스페이스 WindowsApplication1 ( 공개 부분 클래스 Form2: Form ( 공개 Form2() ( 초기화 구성 요소(); ) 비공개 void 버튼1_Click(객체 전송자, EventArgs e) ( Program.f1.button1.Text = "test"; // 텍스트 변경 양식 버튼 Form1 ) ) )

관리자별.

C#을 배우는 것은 느립니다. 그러나 그것은 충실하게 계속됩니다. 최근에 나는
Visual C#의 한 양식에서 다른 양식을 여는 방법에 대한 예를 제공했습니다. 원칙적으로 모든 것이 간단합니다.

오늘 다음 작업이 나타났습니다: 애플리케이션의 기본 폼에서 모달 폼을 시작하고, 닫힐 때 이 폼은 일부 데이터(텍스트, 속성 값 등)를 기본 폼의 컨트롤에 전달해야 합니다. 이전 게시물에서 양식에 대해 설명한 방법으로는 이 문제를 해결할 수 없습니다. 이 경우 모든 속성에 대한 새로운 값을 가진 새로운 양식 객체를 생성하기만 하면 됩니다. 다행히 C#에는 훌륭한 가비지 수집기가 있습니다. 하지만 요점은 수집기가 아니라 C#에서 하위 양식을 연 다음 기본 양식으로 돌아가는 방법입니다.

우선 초기(초기) 데이터를 설정해 봅시다.

그래서. 주요 신청서는 다음과 같습니다.

이 양식에는 TBDialog라는 이름의 TextBox와 클릭해야 하는 Button 버튼도 포함되어 있습니다.

  1. 합격 가치 텍스트 속성 TBDialog에서 TBMain으로;
  2. fDialog를 닫습니다.

이제 전체 과정을 순서대로 살펴보겠습니다.

첫째, 기본적으로 C#의 모든 속성, 변수 및 메서드에는 수정자가 할당된다는 점을 항상 기억할 가치가 있습니다. 사적인– 따라서 두 번째 양식에서 첫 번째 양식의 컨트롤로 이동하려면 TBMain에 대한 수정자를 설정해야 합니다. 공공의스스로. 이렇게 하려면 양식 디자이너에서 TBMain 요소를 선택하고 속성 창으로 이동한 다음 속성값을 변경하다 수정자 와 함께 사적인~에 공공의

이제 TBMain이 다른 개체에 표시됩니다. 계속 진행합시다. 모달 모드에서 양식을 열려면 ShowDialog() 메서드에 대해 두 가지 옵션 중 하나를 사용해야 합니다.

공개 DialogResult ShowDialog() ; 공개 DialogResult ShowDialog(IWin32Window 소유자) ;

첫 번째 경우, 메서드는 현재 활성 창을 소유자로 설정한 모달 대화 상자로 양식을 표시하고, 두 번째 경우에는 모달 창의 소유자가 될 양식을 독립적으로 지정할 수 있습니다.

예를 들어 ShowDialog() 메서드의 두 번째 버전을 사용하고 두 번째 양식을 모달로 표시해 보겠습니다. 이를 위해 다음과 같이 작성하겠습니다.

여기서 나는 다시 이점을 얻었다 예어 이것 , 즉 현재 객체를 가리킵니다. 기본 양식을 소유자로 설정( f메인). 이제 문제 해결로 직접 이동하여 질문에 답해 보겠습니다. 한 양식에서 다른 양식으로 값을 전달하는 방법은 무엇입니까?각 컨트롤에는 놀라운 속성이 있습니다. 소유자 – 부모를 가리킨다:

이제 프로젝트를 실행하고 하위 양식의 TextBox 텍스트가 첫 번째 양식의 TextBox로 완벽하게 전송되는지 확인할 수 있습니다. 혹시나 해서 예제에서 다룬 프로젝트의 소스코드를 올려드립니다.