한 양식에서 다른 양식으로 값 보내기
두 Forms (C #)간에 값을 전달하고 싶습니다. 어떻게하니?
Form1과 Form2의 두 가지 양식이 있습니다.
Form1에는 단추가 하나 있습니다. 이 버튼을 클릭하면 Form2가 열리고 Form1은 비활성 모드 (즉, 선택할 수 없음)에 있어야합니다.
Form2에는 하나의 텍스트 상자와 하나의 제출 단추가 있습니다. Form2의 텍스트 상자에 메시지를 입력하고 제출 단추를 클릭하면 Form2가 닫히고 Form1이 제출 된 값으로 강조 표시됩니다.
어떻게하니? 누군가가 간단한 예를 들어 이것을 도와 줄 수 있습니까?
이에 대한 몇 가지 해결책이 있지만 이것이 제가 사용하는 패턴입니다.
// Form 1
// inside the button click event
using(Form2 form2 = new Form2())
{
if(form2.ShowDialog() == DialogResult.OK)
{
someControlOnForm1.Text = form2.TheValue;
}
}
과...
// Inside Form2
// Create a public property to serve the value
public string TheValue
{
get { return someTextBoxOnForm2.Text; }
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2(textBox1.Text);
frm2.Show();
}
public Form2(string qs)
{
InitializeComponent();
textBox1.Text = qs;
}
속성 정의
public static class ControlID {
public static string TextData { get; set; }
}
에서 form2
private void button1_Click(object sender, EventArgs e)
{
ControlID.TextData = txtTextData.Text;
}
데이터 가져 오기 form1
및form3
private void button1_Click(object sender, EventArgs e)
{
string text= ControlID.TextData;
}
한 형식에서 다른 형식으로 데이터를 전달하기위한 일련의 노력 끝에 마침내 안정적인 답을 찾았습니다. 매력처럼 작동합니다.
여러분이해야 할 일은 변수를 public static datatype 'variableName'
한 형태 로 선언하고 다른 형태로 전달할이 변수에 값을 할당하고 형태 이름을 직접 사용하여 다른 형태로이 변수를 호출하는 것 입니다 (이 형태의 객체를 정적 변수에 직접 액세스 할 수 있음 )이 변수 값에 액세스 할 수 있습니다 .
그러한 예는 다음과 같습니다.
Form1
public static int quantity;
quantity=TextBox1.text; \\Value which you want to pass
Form2
TextBox2.Text=Form1.quantity;\\ Data will be placed in TextBox2
공개 문자열 선언 form1
public string getdata;
의 버튼 form1
form2 frm= new form2();
this.hide();
form2.show();
데이터를 보내려면 form1
해당 이벤트에서 다음 이벤트 및 코드를 시도 할 수 있습니다.
form1 frm= new form1();
form1.getdata="some string to be sent to form1";
이제를 닫고 form2
연 후에 form1
반환 된 데이터를 getdata
문자열로 사용할 수 있습니다 .
다양한 winform 프로젝트에서 작업했으며 응용 프로그램이 더 복잡 해짐에 따라 (더 많은 대화 상자와 상호 작용) 창을 수동으로 열고 닫는 작업을 관리하는 것이 어려울 것이기 때문에 일부 이벤트 시스템을 사용하기 시작했습니다. 유지하고 더 발전하십시오.
내 응용 프로그램에 CAB 를 사용 했지만 이벤트 시스템이 있지만 귀하의 경우에는 과잉 일 수 있습니다. :) 더 간단한 응용 프로그램을 위해 자신의 이벤트 를 작성할 수 있습니다.
form1에서 문자열 선언 public string TextBoxString;
form1 클릭 이벤트 추가
private void button1_Click(object sender, EventArgs e)
{
Form1 newform = new Form1();
newform = this;
this.Hide();
MySecform = new Form2(ref newform);
MySecform.Show();
}
form2 생성자에서
public Form2(ref Form1 form1handel)
{
firstformRef = form1handel;
InitializeComponent();
}
form2 상자 변수 Form1 firstformRef에서;
private void Submitt_Click(object sender, EventArgs e)
{
firstformRef.TextBoxString = textBox1.Text;
this.Close();
firstformRef.Show();
}
Form1 코드 :
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
MessageBox.Show("Form1 Message :"+Form2.t.Text); //can put label also in form 1 to show the value got from form2
}
Form2 코드 :
public Form2()
{
InitializeComponent();
t = textBox1; //Initialize with static textbox
}
public static TextBox t=new TextBox(); //make static to get the same value as inserted
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
효과가있다!
이 코드에서는 Form2에 텍스트를 전달합니다. Form2는 textBox1의 텍스트를 보여줍니다. 사용자가 textBox1에 새 텍스트를 입력하고 제출 버튼을 누릅니다. Form1은 해당 텍스트를 가져와 Form1의 텍스트 상자에 표시합니다.
public class Form2 : Form
{
private string oldText;
public Form2(string newText):this()
{
oldText = newText;
btnSubmit.DialogResult = DialogResult.OK;
}
private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = oldText;
}
public string getText()
{
return textBox1.Text;
}
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
DialogResult = System.Windows.Forms.DialogResult.OK;
}
}
}
그리고 이것은 Form1 코드입니다.
public class Form1:Form
{
using (Form2 dialogForm = new Form2("old text to show in Form2"))
{
DialogResult dr = dialogForm.ShowDialog(this);
if (dr == DialogResult.OK)
{
tbSubmittedText = dialogForm.getText();
}
dialogForm.Close();
}
}
생성자는 양식 또는 Gui 객체간에 데이터를 전달하는 가장 좋은 방법입니다. form1 클릭 버튼에는 다음이 있어야합니다.
Form1.Enable = false;
Form2 f = new Form2();
f.ShowDialog();
양식 2에서 사용자가 버튼을 클릭하면 다음과 같은 코드가 있어야합니다.
this.Close();
Form1 form = new Form1(textBox1.Text)
form.Show();
양식 1의 양식로드 내부에 있으면 생성자에서 값을 가져올 때 코드를 추가하여 모든 작업을 수행 할 수 있습니다.
좋습니다 Form1
. 텍스트 상자가 있습니다. 우선이 Form1
텍스트 상자를 textbox 속성에서 public 으로 설정해야 합니다.
코드 Form1 :
Public button1_click()
{
Form2 secondForm = new Form2(this);
secondForm.Show();
}
패스 Form1
로 this
생성자한다.
코드 Form2 :
Private Form1 _firstForm;
Public Form2(Form1 firstForm)
{
_firstForm = firstForm:
}
Public button_click()
{
_firstForm.textBox.text=label1.text;
This.Close();
}
양식에서 다른 양식으로 값을 전달하는 방법
1.) Form2로 이동 한 다음 두 번 클릭하십시오. 코드 유형에서 this.
public Form2(string v)
{
InitializeComponent();
textBox1.Text = v;
}
2.) Form1로 이동 한 다음 두 번 클릭합니다. 코드 유형에서 this. // Form1의 명령 단추에서
private void button1_Click(object sender, EventArgs e)
{
Form2 F2 = new Form2(textBox1.Text);
F2.Show();
}
다음과 같이 Form1의 텍스트 상자를 매개 변수로 전달할 수 있습니다.
양식 1 buttom 핸들러에서 :
private void button2_Click(object sender, EventArgs e)
{
Form2 newWindow = new Form2(textBoxForReturnValue);
newWindow.Show();
}
양식 2
public static TextBox textBox2; // class atribute
public Form2(TextBox textBoxForReturnValue)
{
textBox2= textBoxForReturnValue;
}
private void btnClose_Click(object sender, EventArgs e)
{
textBox2.Text = dataGridView1.CurrentCell.Value.ToString().Trim();
this.Close();
}
이것은 매우 간단합니다. Form1과 Form2의 2 개의 창 형식이 있고 Form1에서 Form2로 textbox1의 레코드를 보내고 Form2의 label1에이 레코드를 표시하려고한다고 가정합니다. 그런 다음 Form2에서 이름이 label1 인 레이블을 만들고 label1의 속성으로 이동하여 'Modifiers'= public을 설정하고 Form 1에서 id textBox1과 이름 제출 버튼이있는 textBox를 만든 다음 버튼 클릭 이벤트에 다음 코드를 작성하십시오
button1_Click(object sender, EventArgs e)
{
Form2 obj=new Form2();
obj.label1.text=textBox1.text.ToString();
obj.show();
}
그게 다야 ...이 방법으로 데이터 세트 레코드를 다른 양식의 datagridview에 바인딩 할 수 있습니다 ...
원하는 경우 다른 접근 방식을 사용할 수 있습니다.
- System.Action 사용 (여기서는 콜백 함수처럼 기본 양식 함수를 매개 변수로 자식 양식에 전달하기 만하면됩니다)
- OpenForms 메서드 (열린 양식 중 하나를 직접 호출)
System.Action 사용
하위 양식에 전달 된 콜백 함수로 생각할 수 있습니다.
// -------- IN THE MAIN FORM --------
// CALLING THE CHILD FORM IN YOUR CODE LOOKS LIKE THIS
Options frmOptions = new Options(UpdateSettings);
frmOptions.Show();
// YOUR FUNCTION IN THE MAIN FORM TO BE EXECUTED
public void UpdateSettings(string data)
{
// DO YOUR STUFF HERE
}
// -------- IN THE CHILD FORM --------
Action<string> UpdateSettings = null;
// IN THE CHILD FORMS CONSTRUCTOR
public Options(Action<string> UpdateSettings)
{
InitializeComponent();
this.UpdateSettings = UpdateSettings;
}
private void btnUpdate_Click(object sender, EventArgs e)
{
// CALLING THE CALLBACK FUNCTION
if (UpdateSettings != null)
UpdateSettings("some data");
}
OpenForms 메서드
이 방법은 간단합니다 ( 2 줄 ). 그러나 열린 양식에서만 작동합니다. 데이터를 전달할 위치에이 두 줄을 추가하기 만하면됩니다.
Main frmMain = (Main)Application.OpenForms["Main"];
frmMain.UpdateSettings("Some data");
이것을 사용할 수 있습니다.
Form1 button1 클릭
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
this.Hide();
frm2.Show();
}
그리고 이것을 Form2에 추가하십시오.
public string info = "";
Form2 button1 클릭
private void button1_Click(object sender, EventArgs e)
{
info = textBox1.Text;
this.Hide();
BeginInvoke(new MethodInvoker(() =>
{
Gogo();
}));
}
public void Gogo()
{
Form1 frm = new Form1();
frm.Show();
frm.Text = info;
}
다음과 같이 간단하게 가치를 얻으십시오.
var form1 = new Form1();
string sample = form1.examplestring;
값을 설정하려면 :
var form1 = new Form1();
form1.examplestring = example;
그러나 문자열이 "공용 문자열"인지 확인하십시오.
public string example = "test";
Form에있는 컨트롤의 Modifiers Property를 Public으로 변경하면 다른 Form이 해당 컨트롤에 액세스 할 수 있습니다. fe :
Form2 frm;
private void Form1_Load(object sender, EventArgs e)
{
frm = new Form2();
frm.Show();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(frm.txtUserName.Text);
//txtUserName is a TextBox with Modifiers=Public
}
How about using a public Event
I would do it like this.
public class Form2
{
public event Action<string> SomethingCompleted;
private void Submit_Click(object sender, EventArgs e)
{
SomethingCompleted?.Invoke(txtData.Text);
this.Close();
}
}
and call it from Form1 like this.
private void btnOpenForm2_Click(object sender, EventArgs e)
{
using (var frm = new Form2())
{
frm.SomethingCompleted += text => {
this.txtData.Text = text;
};
frm.ShowDialog();
}
}
Then, Form1 could get a text from Form2 when Form2 is closed
Thank you.
참고URL : https://stackoverflow.com/questions/1559770/send-values-from-one-form-to-another-form
'programing tip' 카테고리의 다른 글
Java에 sizeof-like 메소드가 있습니까? (0) | 2020.10.30 |
---|---|
파이썬의 바이트 배열 (0) | 2020.10.30 |
Android에서 assert를 사용하는 방법은 무엇입니까? (0) | 2020.10.30 |
TypeError : 데이터를 지수 적으로 맞추려고 시도하는 동안 길이 1 배열 만 Python 스칼라로 변환 될 수 있습니다. (0) | 2020.10.29 |
브레이크 (루프 / 스위치)에 응답하는 내부 구조에서 외부 루프를 끊는 방법 (0) | 2020.10.29 |