2013-07-18 2 views
1

위임자와 이벤트가있는 클래스 간의 통신 데모를 개발하는 데는 며칠이 걸렸습니다. 이 클래스 간의 데이터 전달을 수행하는 최상의 방법인지 여부를 알고 싶습니다. 더 좋은 방법이 있으면 알려주세요. 특히, 하위 클래스에서 무언가가 발생하면 어떻게 메인 클래스로 되돌릴 수 있습니까? 이는 비즈니스 로직 레벨 및 데이터 액세스 레벨에서 사용자 인터페이스를 분리하여 n 계층 아키텍처를 수행 할 때 특히 유용합니다.여러 클래스가있는 대리모 및 이벤트

나는 tb1, tb2 및 tbAnswer라는 3 개의 텍스트 상자가있는 양식이 있습니다. "추가"라고 표시된 버튼이 있으며 버튼 1입니다.

주요 형식은 다음과 같습니다

namespace DelegateTest 
{ 
    public delegate void ShowMessage(object sender, Form1.AnswerEventArgs e); 

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

     private void a_OnShowMessage(object sender, AnswerEventArgs e) 
     { 
      tbAnswer.Text = e.answer; 
     } 

     public class AnswerEventArgs :EventArgs 
     { 
      public string answer { get; set; } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      AddClass a = new AddClass(); 
      a.OnShowMessage += new ShowMessage(a_OnShowMessage); 
      a.AddMe(Convert.ToInt16(tb1.Text), Convert.ToInt16(tb2.Text)); 
     } 
    } 
} 

과 하위 폼이라고 AddClass.cs은 다음과 같습니다

namespace DelegateTest 
{ 
    class AddClass 
    { 
     public event ShowMessage OnShowMessage; 
     public void AddMe(int a, int b) 
     { 
      Form1.AnswerEventArgs e = new Form1.AnswerEventArgs(); 
      e.answer = (a+b).ToString(); 
      OnShowMessage(this, e); 
     } 
    } 
} 
+0

Jon 코드 형식을 도와 주셔서 감사합니다. 나는 그걸로 고투한다. – SDanks

답변

2

귀하의 접근 방식은 두 가지 사항을 제외하고 소리입니다.

먼저 처리기를 추가하기 전에 이벤트가 발생하면 NullPointerException이 발생합니다. 두 가지 방법 중 하나로이 문제를 해결할 수 있습니다. 빈 대리인에게 이벤트를 초기화)

var showMessage = OnShowMessage; 
if (showMessage != null) 
{ 
    showMessage(this, e); 
} 

: 2 :

1)() 경쟁 조건을 피하기 위해 로컬 복사본을 만들어 널 (null)이 있는지 확인

public event ShowMessage OnShowMessage = delegate { }; 

두 번째 이 경우 자신의 대리자를 선언 할 필요가 없습니다. 당신은 단순히 자신의 이벤트 인수와 표준 EventHandler를 만들 수 있습니다

public event EventHandler<Form1.AnswerEventArgs> OnShowMessage = delegate { }; 

자세한 내용은 How to: Publish Events that Conform to .NET Framework Guidelines를 참조하십시오.

+0

그래서 공개 이벤트 인 ShowMessage를 public 이벤트 EventHandler로 대체했습니다. 이제 .... : 'DelegateTest.ShowMessage'형식을 'System.EventHandler '형식으로 암시 적으로 변환 할 수 없습니다. – SDanks

+0

기억하십니까? a.OnShowMessage + = 새로운 ShowMessage (a_OnShowMessage);를'a.OnShowMessage + = a_OnShowMessage; '로 변경 하시겠습니까? 이 기능이 작동하면'ShowMessage' 선언을 삭제할 수 있습니다. – piedar

+0

좋아,이게 정말 도움이 될 것 같아. 나는 주변을 파고 있었지만 어떻게 든 매개 변수를 전달해야한다고 생각했습니다. 잘 됐네, 고마워. – SDanks

관련 문제