2012-10-31 2 views
2

에 부모에서 자식 폼 프로세스를 실행합니다. 예를 들어, 하위 폼에 3 개의 텍스트 상자가 있습니다. 처음 두 텍스트 상자에 두 값을 추가하고 그 결과를 세 번째 텍스트 상자에 씁니다. 부모 폼에 버튼을두고 싶습니다 (버튼을 실행 버튼이라고 부르면됩니다). 또한 다른 계산을 수행하는 다른 자식 폼이 있으므로 실행 단추가 포커스가있는 폼에 따라 동작하게하고 싶습니다. 아무도 내가 그것을 어떻게해야하는지 안다?내가 MDI 자식이 부모를 형성 실행하려면 C#을

계산을 수행 할 각 자식 폼에 메서드를 작성했으며 부모 폼의 실행 단추에서이 메서드를 호출하지만 자식 폼 텍스트 상자의 값 (예 : null)을 인식하지 못합니다. 누군가가 나를 도울 수 있다면 그것은 대단 할 것입니다.

감사

코드는 매우 간단합니다 나는 세 자식 폼의 텍스트 상자와 처음 두의 사용자 입력 값을하고 난 부모 폼에서 실행 버튼의 값을 클릭합니다 자식 폼의 세 번째 텍스트 상자는 처음 두 개의 텍스트 상자 값의 합계가됩니다. 나는 부모 폼에서 호출 할 수 있지만 부모 폼에서

public void AddValues() 
     { 
      double a = double.Parse(textBox1.Text); 
      double b = double.Parse(textBox2.Text); 
      textBox3.Text = (a + b).ToString(); 
     } 

작동하지 않는 자식 폼에이 방법을 나는 당신의 자식 폼에서

private void button1_Click(object sender, EventArgs e) 
     { 
      ChildFrom child = new ChildFrom(); 
      child.AddValues(); 
     } 
+1

후 자녀의 코드가 수행 할 수 있습니다 –

+0

을 형성하고, 코드 ......... – andy

+0

에 오신 것을 환영합니다 SO에 업로드하시기 바랍니다! 질문을 편집하여 코드를 추가 할 수 있습니다. 이것은 가독성을 향상시킬 것입니다;) 재미있게 놀아 라! – Nippey

답변

2

있습니다

을 부모의 형태로

public void AddValues() //add error handling 
{ 
    double a = double.Parse(textBox1.Text); 
    double b = double.Parse(textBox2.Text); 
    textBox3.Text = (a + b).ToString(); 
} 
당신은 당신이 여는 자식 폼의 동일한 인스턴스에 AddValues를 호출해야합니다. 즉, 부모 형태로 :

public partial class ParentForm : Form 
{ 
    ChildForm _cF; //member field 

    public ParentForm() 
    { 
     InitializeComponent(); 
    } 

    private void OpenChildForm() //this is how you should open the form 
    {       //call this function in whichever event 
     _cf = new ChildForm(); //you are opening the child form. 
     _cf.Show(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //please remove these lines, its wrong! 
     //ChildFrom child = new ChildFrom(); 
     //child.AddValues(); 

     //do this instead: 
     _cf.AddValues(); 
    } 
} 

여기서 중요한 것은 하위 양식의 동일한 인스턴스에서 작동하는 것입니다. 처음부터 끝까지 필요하다면 부모 형태로 회원 필드를 만드십시오.

편집 : 자식 폼이 구성원 변수가되지 않아도된다면 C#의 클로저에 의존 할 수 있습니다. 부모 폼에서

:

private void OpenChildForm() 
{ 
    ChildForm cf = new ChildForm(); 
    cf.Show(); 

    btnRun.Clicked -= OnRunButtonClicked(cf); //important - to avoid multiple- 
    btnRun.Clicked += OnRunButtonClicked(cf); //handlers getting attached. 
} 

private EventHandler OnRunButtonClicked(ChildForm cf) 
{ 
    return (sender, e) => cf.AddValues(); 
} 

테이크 관리 초기화 부분에서 btnRun에 기존의 클릭 핸들러를 제거합니다.

+0

답변 해 주셔서 감사합니다. 그것은 자식 폼을 열 때 작동하지만 자식 폼이 이미 열려 있고 사용자가 텍스트 상자에 새 값을 입력하면 작동하지 않습니다. 그것은 값을 가지고 있지만 텍스트 상자의 값을 null로 반환합니다. – Ehsan

+0

@ user1787601 그럴 수는 없습니다. 부모 폼의 멤버 필드로 childForm 인스턴스가 실제로 있습니까? 'AddValues' 함수가 작동하려면 같은 인스턴스가 필요합니다. 다른 말로하면,'ChildForm cf = new ChildForm(); cf.AddValues ​​();'단순히 작동하지 않습니다. 내가 게시 한대로해라. 또는 회원 정보 필드가 무엇인지 생각하지 못하면 편집을 참조하십시오. – nawfal

+0

다음은 링크의 예입니다. http://postimage.org/image/j194eslcd/ 아이를 열지 않습니다. 형태. 새 단추를 클릭하면 부모 폼에서 이미 열립니다. 이제 Run 단추에서 cf.AddValues ​​()를 호출하지만 텍스트 상자가 비어있는 동안 오류가 발생합니다. – Ehsan

관련 문제