2011-11-01 2 views
0

2 개의 Windows Forms가 있습니다.form2에서 form1의 텍스트 상자를 업데이트하는 방법은 무엇입니까?

먼저, 메인 윈도우 폼에는 여러 줄의 텍스트 상자와 버튼이 있습니다. 이 버튼은 AddEntry 객체를 사용하여 배열에 데이터를 추가 할 수있는 두 번째 양식을 엽니 다.

두 번째 폼에는 텍스트 상자의 내용을 첫 번째 폼에서 업데이트해야하는 단추 (btnAddEntry)와 텍스트 상자가 있습니다.

데이터가 입력되면 첫 번째 양식의 텍스트 상자에 데이터를 표시하려고합니다.

문제는 내가 생각해 낸 코드가 작동하지 않는 것입니다.

어떻게 해결할 수 있습니까?

+0

정확히 무엇이 작동하지 않습니까? –

+0

@Aaron McIver : 두 번째 양식에 항목을 추가하면 첫 번째 양식의 텍스트 상자에있는 텍스트가 변경되지 않는 것 같습니다. – HelpNeeder

답변

3

는 다음 .. 새 프로젝트를 만들려면 어떻게해야합니까 작업 기초를 얻을 수 있습니다. 귀하의 현재 코드, 창 등의 아무 것도 ... 기본 프로젝트는 "Form1"양식을 만들 것입니다 지금 혼자 떠나.

프로젝트에 새 양식을 추가하면 기본적으로 "Form2"로 표시됩니다. 단일 텍스트 상자와 단일 단추를 그 위에 놓습니다. grins 및 개체 이름을 구별하는 명확한 설명을 위해 "txtOnForm2"및 "btnOnForm2"(대문자, 샘플은 읽기 쉽고 "txtonform2"는 모두 소문자)에 Form2의 컨트롤 이름을 변경합니다. 이제 폼에서 마우스 오른쪽 버튼을 클릭하고 "코드보기"를 클릭하십시오. 생성자가있는 다른 "부분 클래스"선언으로 이동합니다.다음 추가에 대한 ... 우리는 다음을 Form1에 코드를 넣으면됩니다 나머지 절반으로

// specifically typecasting the TYPE of form being passed in, 
// not just a generic form. We need to see the exposed elements 
Form1 CalledFrom; 
// Ensure to do the : this() to make sure default behavior 
// to initialize the controls on the form are created too. 
public Form2(Form1 viaParameter) : this() 
{ 
    CalledFrom = viaParameter; 
} 

private void btnOnForm2_Click(object sender, EventArgs e) 
{ 
    CalledFrom.ValuesByProperty = this.txtOnForm2.Text; 
    MessageBox.Show("Check form 1 textbox"); 

    string GettingBack = CalledFrom.ValuesByProperty; 
    MessageBox.Show(GettingBack); 

    CalledFrom.SetViaMethod("forced value, not from textbox"); 
    MessageBox.Show("Check form 1 textbox"); 

    GettingBack = CalledFrom.GetViaMethod(); 
    MessageBox.Show(GettingBack); 
} 

저장 오류를 컴파일하고 Form2를 디자이너 및 코드 창을 닫습니다 걱정하지 말아.

이제 Form1을 엽니 다. 하나의 텍스트 상자와 하나의 버튼을 그 위에 놓습니다. 컨트롤의 기본 이름은 각각 "textbox1"및 "button1"입니다. 있는 그대로 그대로 둡니다. 버튼을 두 번 클릭하십시오 (form1). 해당 버튼에 대한 코드 스 니펫이 표시됩니다. 다음 붙여 넣기

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 oFrm = new Form2(this); 
    oFrm.Show(); 
} 

public string ValuesByProperty 
{ 
    get { return this.textBox1.Text; } 
    set { this.textBox1.Text = value; } 
} 

public void SetViaMethod(string newValue) 
{ this.textBox1.Text = newValue; } 

public string GetViaMethod() 
{ return this.textBox1.Text; } 

이제 양식을 저장하고 실행하십시오. 첫 번째 양식에서 버튼을 클릭하면 두 번째 인스턴스가 이미 생성 된 자체 인스턴스로 호출되며 두 번째 인스턴스는 새로운 자체 인스턴스로 호출되지 않습니다. 두 번째 양식이 표시됩니다. 둘 다 볼 수 있도록 창을 이동하십시오.

텍스트 상자의 두 번째 창에 텍스트를 입력하고 버튼을 클릭하십시오.오고가는 것의 앞뒤를 따라 가십시오.

+0

기본 사항이 좋습니다! +1! 당신은 큰 도움이됩니다. – HelpNeeder

1

이 대답했습니다 다른 시간, 유사한 원리 ...

"패스 백"정보에서하기 similar question

를 살펴 보자 : Form2를 Form1에, 공용 방법을 만들어야합니다 당신이 만지고 싶은 것을 폭로하기 위해 그런 다음 두 번째 형식 (기본적으로 포인터 인스턴스가 첫 번째 인스턴스와 같음)에서 수행 할 공용 속성을 사용하여 수행 할 수 있습니다.

이미

공공 부분 클래스 YourSecondForm { 양식 ObjRefToFirstForm 두 번째 형태에서 얻을하는 방법은 지금 ...

public partial class YourFirstForm 
{ 
    // example to expose a method on first form and pass IN a value 
    public void SetMyObject(string ValueFromSecondForm) 
    { 
     this.txtBox1.Text = ValueFromSecondForm; 
    } 

    // example via a property you are trying to set... identical in results 
    public string ViaSetAsProperty 
    { set { this.txtBox1.Text = value; } } 

    // Now, the reverse, lets expose some things from form 1 to the second... 
    public string GetMyObjectText() 
    { 
     return this.txtBox1.Text; 
    } 

    // or via a GETTER property... 
    public string GettingText 
    { get { return this.txtBox1.Text; } } 


    // However, if you want to allow both set and get to form 1's values, 
    // do as a single property with both getter/setter exposed.. 
    public string TextContent 
    { get { return this.txtBox1.Text; } 
     set { this.txtBox1.text = value; } 
    } 
} 

작업 한 수도

public YourSecondForm(Form passedInVar) 
{ 
    // preserve the first form 
    ObjRefToFirstForm = passedInVar; 
} 

// Now, however you want to handle... via a button click, the text change event, etc 
public void SendDataToForm1() 
{ 
    // via calling the METHOD on form 1 that is public 
    ObjRefToFirstForm.SetMyObj(this.SomeOtherTextbox.Text); 

    // via a SETTER on form 1 
    ObjRefToFirstForm.ViaSetAsProperty = this.SomeOtherTextbox.Text; 


    // sample to GET something from form 1 via method 
    string TestGet = ObjRefToFirstForm.GetMyObjectText(); 

    // or from the exposed property 
    TestGet = ObjRefToFirstForm.GettingText; 


    // Now, try via the one property that has both a setter and getter 
    ObjRefToFirstForm.TextContent = this.SomeOtherTextbox.Text; 
    TestGet = ObjRefToFirstForm.TextContent; 
} 

}

는 희망이 모두 얻을 당신을 위해 형태와 내용 ... 설정 모두 같은 방법() 접근 방법을 노출 및/또는 취득/속성을 통해 설정합니다.

+0

첫 번째 양식에서 두 번째 양식으로 데이터를 표시하는 방법을 설명합니다. 그러나 그 반대는 주 양식에 뒤지지 만 작동하지 않는 것 같습니다. – HelpNeeder

+0

이 사이트의 예제는 저를 호소하지 않습니다. 제 상황에서 어떻게 작동시키는 지 설명해 주시겠습니까? 그것은 모두 두 번째 형식에 관한 것이지 첫 번째 형식에서의 작동 방식이 아닙니다. – HelpNeeder

+0

@HelpNeeder, 수정 된 답변/샘플 참조 – DRapp

1

MainWindow mainWindow = new MainWindow()는 기존 버전에 대한 참조가 아닌 MainWindow의 새 버전을 만듭니다.

AddEntryWindow addEntryWindow = new AddEntryWindow(); 
addEntryWindow.ShowDialog(this); 
: 당신의 두번째 양식을 열 때 당신의 MainWindow를 양식에서이 같은 (유형 개체의 소유자라는 변수에 저장하는) Show 메서드로 전달하여 제 2 형태에 따라 참조를 전달해야

그런 다음 당신은 다음과 같은 텍스트 상자를 참조 할 수 있습니다 :

foreach (AddEntry list in addedEntry) 
{ 
    // Displaying and formating the output in text box in MainWindow.   
    ((MainWindow)owner).txtDisplayFileContent.Text += txtUserName.Text; 
} 
+0

이렇게하면 다음과 같은 오류 메시지가 나타납니다. 'owner'라는 이름이 현재 컨텍스트에 없습니다. – HelpNeeder

+0

MainWindow에서 이와 같이 AddEntry 양식을 여는 중입니까? AddEntryWindow addEntryWindow = 새로운 AddEntryWindow(); addEntryWindow.Show (this); –

+0

예. 귀하의 코드 전에 가지고있는 내용으로 OP를 업데이트했습니다. – HelpNeeder

관련 문제