한 양식에서 다른 양식으로 값 보내기


84

두 Forms (C #)간에 값을 전달하고 싶습니다. 어떻게하니?

Form1과 Form2의 두 가지 양식이 있습니다.

Form1에는 단추가 하나 있습니다. 이 버튼을 클릭하면 Form2가 열리고 Form1은 비활성 모드 (즉, 선택할 수 없음)에 있어야합니다.

Form2에는 하나의 텍스트 상자와 하나의 제출 단추가 있습니다. Form2의 텍스트 상자에 메시지를 입력하고 제출 단추를 클릭하면 Form2가 닫히고 Form1이 제출 된 값으로 강조 표시됩니다.

어떻게하니? 누군가가 간단한 예를 들어 이것을 도와 줄 수 있습니까?


이것에 대한 예가 있습니까?
Millar

답변:


58

이에 대한 몇 가지 해결책이 있지만 이것이 제가 사용하는 패턴입니다.

// 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; }
}

나는 이것이 나쁜 행동 규범이라고 생각했습니다. 그럼 대단합니다. 이 패턴도 사용할 것입니다
CasperT

글쎄, 나는 그것이 나쁜 "행동"이라고 생각하지 않지만,이 패턴을 사용하기 전에 고려해야 할 보안 함의가 있습니다. (하지만, 아주 간단한 예 +1)

1
또한 form2.Close (); 대신 form2에 있어야 함을 잊지 마십시오. "DialogResult = DialogResult.OK;"사용 또는 양식이 열렸 음을 감지하지 못합니다.
Burgo855

39
private void button1_Click(object sender, EventArgs e)
{
        Form2 frm2 = new Form2(textBox1.Text);
        frm2.Show();    
}

 public Form2(string qs)
    {
        InitializeComponent();
        textBox1.Text = qs;

    }

2
이 코드를 테스트했는데 Form2의 기본 생성자를 호출하지 않으면 public Form2(string qs):this(){}양식이 제대로 표시되지 않습니다.
르네

이것은 내가 사용한 옵션이며 잘 작동했습니다!
Symon

14

속성 정의

public static class ControlID {  
    public static string TextData { get; set; }
}

에서 form2

private void button1_Click(object sender, EventArgs e)
{  
    ControlID.TextData = txtTextData.Text;   
}

데이터 가져 오기 form1form3

private void button1_Click(object sender, EventArgs e)
{   
    string text=  ControlID.TextData;   
}

6

한 양식에서 다른 양식으로 데이터를 전달하기위한 일련의 노력 끝에 마침내 안정적인 답을 찾았습니다. 매력처럼 작동합니다.

여러분이해야 할 일은 변수를 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

3
이 접근 방식의 문제는 여러 개의 Form1이 열려있는 경우 "수량"값을 재정의한다는 것입니다. 그리고 Form2는 최근에 열린 Form1의 값을 얻습니다.
Arash Aghlara 2015 년

4

공개 문자열 선언 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문자열로 사용할 수 있습니다 .


나는 내 양식에서 당신이 제안한 것과 똑같이하고 있지만 내가 얻는 문제는 푸시 버튼을 다시 누르는 한 반환 값이 텍스트 필드에 나타나지 않는다는 것입니다.
wsDev

3

저는 다양한 winform 프로젝트에서 작업했으며 응용 프로그램이 더 복잡 해짐에 따라 (더 많은 대화와 상호 작용) 창을 수동으로 열고 닫는 작업을 관리하는 것이 어렵 기 때문에 일부 이벤트 시스템을 사용하여 저를 돕기 시작했습니다. 유지하고 더 발전하십시오.

내 응용 프로그램에 CAB 를 사용 했지만 이벤트 시스템이 있지만 귀하의 경우에는 과잉 일 수 있습니다. :) 더 간단한 응용 프로그램을 위해 자신의 이벤트작성할 수 있습니다.


이벤트의 경우 +1, 확장 성이 좋습니다. 그러나 실제로 값을 어디에 저장합니까? 정적 클래스는 충분히 간단하지만 전역 변수를 사용하는 것과 비슷합니다. 각 양식에 관련된 설정에 대한 자체 로컬 변수가 있습니까?

2

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까요? 생성자 this에게 전달하지 않는 이유는 무엇 Form2입니까?

2

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();

        }

효과가있다!


2

이 코드에서는 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();
    }
}

2

좋습니다 Form1. 텍스트 상자가 있습니다. 우선이 Form1텍스트 상자를 textbox 속성에서 public 으로 설정해야 합니다.

코드 Form1 :

Public button1_click()
{
    Form2 secondForm = new Form2(this);
    secondForm.Show();
}

패스 Form1this생성자한다.

코드 Form2 :

Private Form1 _firstForm;

Public Form2(Form1 firstForm)
{
    _firstForm = firstForm:
}

Public button_click()
{
    _firstForm.textBox.text=label1.text;
    This.Close();
}

차이 때문에이 게시물에 왔습니다. 내가 대답 한 질문. 이것은 선호되고 현대적인 프로그램에서 mainform을 childrenform에 전달하는 것이 종종 도움이 될 것입니다. 이것은 선호되는 대답이어야합니다.
Nico Walsemann

1

다음과 같이 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();
}

1

생성자는 양식 또는 Gui 객체간에 데이터를 전달하는 가장 좋은 방법입니다. form1 클릭 버튼에는 다음이 있어야합니다.

Form1.Enable = false;
Form2 f = new Form2();
f.ShowDialog();

양식 2에서 사용자가 버튼을 클릭하면 다음과 같은 코드가 있어야합니다.

this.Close();
Form1 form = new Form1(textBox1.Text)
form.Show();

양식 1의 양식로드 내부에 있으면 생성자에서 값을 가져올 때 코드를 추가하여 모든 작업을 수행 할 수 있습니다.


감사. 이것은 나에게 가장 의미가 있습니다. 나는이 페이지의 다른 모든 것을 시도했고 이것이 효과가 있었던 유일한 사람이었습니다!
Chud37

0

양식에서 다른 양식으로 값을 전달하는 방법

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();
}

0

이것은 매우 간단합니다. 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에 바인딩 할 수 있습니다 ...


0

원하는 경우 다른 접근 방식을 사용할 수 있습니다.

  1. System.Action 사용 (여기서는 콜백 함수처럼 기본 양식 함수를 매개 변수로 자식 양식에 전달하기 만하면됩니다)
  2. 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");

여기에 비슷한 질문에 대한 답변을 제공 했습니다.


0

이것을 사용할 수 있습니다.

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;
}

0

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        
    }

-1

공개 이벤트 이용은 어떻습니까

이렇게하겠습니다.

public class Form2
{
   public event Action<string> SomethingCompleted;

   private void Submit_Click(object sender, EventArgs e)
   {
       SomethingCompleted?.Invoke(txtData.Text);
       this.Close();
   }
}

다음과 같이 Form1에서 호출하십시오.

private void btnOpenForm2_Click(object sender, EventArgs e)
{
    using (var frm = new Form2())
    {
        frm.SomethingCompleted += text => {
            this.txtData.Text = text;
        };

        frm.ShowDialog();
    }
}

그런 다음 Form2가 닫힐 때 Form1이 Form2에서 텍스트를 가져올 수 있습니다.

감사합니다.


-1
// In form 1
public static string Username = Me;

// In form 2's load block
string _UserName = Form1.Username;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.