2012-12-16 2 views
0

다른 클래스를 사용하여 Form1의 목록 상자에 무언가를 추가하려고합니다. 어떻게해야합니까?다른 클래스에서 컨트롤 호출

이 내 현재 코드입니다 :

Form1.cs를 "테스트"클래스에서 오는가

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void writeTest(string items) 
    { 
     this.listBox1.Items.Add(items); 
    } 
} 

Test.cs

class Test 
{ 
    Form1 frm1 = new Form1(); 

    public void test() 
    { 
     frm1.writeTest("Hello"); 
    } 
} 
+0

내에서 서로 다른 클래스를 사용한다? – hattenn

+0

Form1이 시작 양식입니까? –

답변

0

를? Form1 내에서 만들어 졌다고 가정합니다. 그것을 만드는 동안 Form1의 참조를 Test에 전달할 수 있습니다. 예를 들어 :

public Form1() { 
    test = new Test(this); 
} 


class Test { 
    private Form1 form; 
    public Test(Form1 f) { 
    form = f; 
    } 
    ... 

는, 당신은 테스트 내에서 양식에 액세스 할 수 있습니다.

+0

테스트 클래스는 Form1 안에 있지 않지만 코드를 시험해 보겠습니다. 감사! – user1621338

+0

정확하게'Test' 클래스는 어디에 있습니까? 메서드가있는 클래스가 다른 스레드에서 호출되는 한 중요하지 않습니다. – hattenn

0

이 예에서는 커플 링이 매우 높습니다. 이것은 원하지 않는 것입니다. 당신이 사용할 수있는 다양한 기술이 있습니다. 당신이 그렇게하지 않았다면 솔리드 원칙을 볼 수 있습니다. (아직하지 않았다면) http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

특히 부분 (의존성 반전). 따라서 귀하의 예에서는 IAddTestItem이라는 인터페이스와 AddTestItem이라는 메서드를 사용할 수 있습니다. 그러나 이것은 여전히 ​​이상적인 것은 아닙니다.

메시징 메커니즘 (옵저버 패턴)을 사용하면 더 많은 이득을 얻을 것으로 생각됩니다. 따라서 MessageBus의 공유 (주입 된) 인스턴스를 가질 수 있습니다. 폼과 클래스 모두 종속성 주입과 같은 것을 사용하여 동일한 인스턴스를받을 수 있습니다 (그러나 다른 메커니즘을 사용할 수도 있음). 그런 다음 클래스에 AddTestItem (더 많은 명령) 또는 심지어 TestItemAdded과 같은 일부 메시지를 게시 할 수 있습니다. 단순히 이벤트가 발생했음을 알리고 목록에 추가하는 것처럼 데이터를 자유롭게 사용할 수있는 경우 (예 : 목록에 추가) 상자.

그러나 코드를 어떻게 든 분해하지 않으면 유지 관리 문제가 발생할 것입니다.

0

이것은 Strategy 패턴의 예입니다. 여기서 우리는리스트 박스의로드를 제어하는 ​​중재자를 사용합니다.

public partial class Form1 : Form 
{ 
    private IMediator _mediator; // any class deriving from IMediator 

    public Form1(IMediator mediator) 
    { 
     InitializeComponent(); 
     _mediator = mediator; 
     LoadList(); 
    } 

    private void LoadList() 
    { 
     // in strategy you might supply different mediators, each may load listbox with different type of items. You pass reference to your control. Load logic is totally up to the external class, such as mediator. 
     _mediator.LoadList(this.listBox1); 
    } 
} 

로드 제어의 예는 현재 코드에 문제가 있습니다 어떤 패턴

관련 문제