2012-04-03 2 views
0

C# 데스크톱 응용 프로그램에 2 개의 폼이 있습니다. Form1과 Form2. Form2의 값이 Form2에서 업데이트되지 않습니다.

public void AddToList(string item) 
{ 
    listBox.Items.Add(item); 
} 

내가 어떤 버튼을 누를에 직접이 메서드를 호출

다음 잘 작동 :

Form1에 다음과 같이 ListBox 컨트롤에 항목을 추가 공용 메서드가 포함되어 있습니다. 그러나 Form2에서이 메서드를 호출하면 Form1의 ListBox 컨트롤에 아무 것도 추가하지 않습니다. Form2의 코드는 다음과 같습니다.

Form1 frm = new Form1(); 
frm.AddToList("something"); 

실행하면 아무 일도 일어나지 않습니다. 오류가 없습니다. ListBox에 항목을 추가하지 않습니다.

내가 뭘 잘못하고 있니?

+0

GUI의 기존 인스턴스를 참조하는 대신 Form1의 새 인스턴스를 만드는 것처럼 들립니다. Form1과 Form2를 표시/사용하는 GUI 레이어 코드를 더 게시 할 수 있습니까? –

+0

프로젝트에 두 개의 * 유형 *이 있습니다. 그러나 각 유형의 객체 *를 두 개 이상 만듭니다. 실수를 보려면 frm.Show()를 추가하십시오. –

+0

두 가지 양식을 어떻게 작성합니까? 둘 다 MDI와 같은 세 번째 형식으로 만들지, 아니면 Form1을 Form2로 만드는 것입니까? 이렇게하면 두 형식을 서로 이야기하는 방법에 대한 답을 얻을 수 있습니다. –

답변

2

인스턴스를 Form1로 만들고 여기에 목록 상자에 항목을 추가하여 의심의 여지없이 Form1의 인스턴스를 가져오고 해당 메서드를 호출해야합니다.

순진한 접근 방식은 Form1의 인스턴스를 가져 와서이 이벤트 처리기에서 사용할 인스턴스 변수로 저장하는 매개 변수를 Form2 생성자에 포함시키는 것입니다.

나는 디자인 관점에서 그 접근법을별로 좋아하지 않습니다.

Form2에 공개 이벤트를 만들고 Form1에 해당 이벤트를 구독하고 목록 상자에 항목을 추가하는 처리기를 추가하는 것이 좋습니다. 형식 2의 이벤트는 다음과 같이 보일 것입니다 :

:
public string SomeValueForm1NeedsOnButtonClick 
{ 
    get 
    { 
     return texbox1.Text; 
    } 
} 

그런 다음 Form1에 당신이 뭔가를해야합니다 :

public event EventHandler ButtonClick 
{ 
    add 
    { 
     button1.Click += value; 
    } 
    remove 
    { 
     button1.Click += value; 
    } 
} 

그런 다음 당신이 뭔가를 보이는 속성이 있습니다

Form2 otherForm = new Form2(); 
otherForm.ButtonClick += (sender, args) => 
{ 
    listbox1.Items.Add(otherForm.SomeValueForm1NeedsOnButtonClick); 
}; 

이 접근법은 각 양식이 서로 다른 양식에 대해 가능한 한 적게 만지도록합니다. 두 클래스 사이의 Coupling을 줄이고 향후 사용자/양식 독자가 명확하게 통신 할 수 있도록합니다. 당신이 frm.Show와 그 코드를 따른 경우

+0

오류가 발생했습니다. "보낸 사람 '이라는 로컬 변수가이 범위에서 선언 할 수 없습니다. 다른 줄을 ...."이 줄에 "otherForm.ButtonClick + = (보낸 사람, args) =>" – Ali

+0

@ 알리 두 컨텍스트 중 하나에서 '보낸 사람'을 다른 사람이라고 부릅니다. 여기서는 사용하지 않았으므로 업데이트 할 것이 없습니다. – Servy

+0

@Ali 이것이 축 어적으로 취해진 것이 아니라는 것을 명심하십시오. 최소한 변수 이름의 대부분은 실제로 표현 된 것으로 변경되어야합니다. 이 일반적인 패턴은 다양한 유형의 작업/이벤트에 대한 모든 종류의 문제에 사용할 수있는 패턴입니다. – Servy

0

Form1 frm = new Form1();

이 라인은 새로운 형식 2의 예를 ... 아니 이미 화면에 표시되는 동일한 인스턴스를 만드는 것입니다. 그래서 당신은이 2 차적인 인스턴스의리스트 박스에 스크린 상에 나타나지 않는 것을 추가하고 있습니다.

0

()는 당신이 그것을 보았을 것입니다. 그게 당신이 원하지 않는 이슈입니다.

문제에 대한 귀하의 접근 방식은 다소 순진합니다.

form2에 속성을 추가하고 사용할 Form1 인스턴스에 속성을 설정할 수 있습니다. (PS form1과 form2는 도움이되지 않습니다. MainForm과 DetailForm 등).

위의 문제는 당신이 끔찍한 의존성을 구현했다는 것입니다.

여러 가지 방법이 있습니다. 하나는 목록을 보유하는 별도의 클래스입니다 (인터페이스와 클래스는 훨씬 더 좋을 것입니다). 그런 다음 teh ihneterface 또는 클래스 유형의 Form1 및 Form2에 속성을 추가하십시오.

Form2는 목록에 추가 할 수 있습니다. 그러면 목록이 변경된 이벤트가 발생합니다.Form1은 이벤트 처리기로 후크 한 다음 해당 작업을 표시하는 데 사용하는 목록 상자를 새로 고칩니다.

폴라 슈에 인프라 스트럭처가 있으면 사용하는 방법이 코드가 많고 보상이 거의 없을 때 모든 종류의 작업을 수행 할 수 있습니다.

관련 문제