2013-06-03 3 views
2

다양한 작업을 수행하는 클래스 라이브러리가 있습니다. 이러한 작업 중 일부는 Windows Form의 사용자 입력에 대한 응답으로 발생합니다. 내가 지금까지 시도한 것은이 같은 라이브러리에 입력 인터페이스를 설정하는 것입니다 : 호출 할 때라이브러리의 함수에서 Windows Form의 사용자 입력을 얻는 방법?

public partial class Form1 : Form,IInputter 
    { 
     string sentText=null; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public string sendInput() 
     { 
      string inputText=sentText; 
      sentText=null; 
      return inputText; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog ofd = new OpenFileDialog(); 
      ofd.Filter = "Excel files (*.xls*)|*.xls*"; 
      DialogResult dr = ofd.ShowDialog(); 
      if (dr == DialogResult.OK) 
      { 
       sentText = ofd.FileName; 
      } 
     } 
    } 

매개 변수로 양식을 전달합니다

public interface IInputter 
{ 
    string sendInput(); 
} 

는 형태로 인터페이스를 구현 양식 코드에서 라이브러리의 기능 :

:

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

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form1 f1 = new Form1(); 
     f1.Show(); 
     Main main = new Main(); 
     main.main(f1); 
    } 
} 

그리고는 라이브러리 함수의 입력 함수를 호출

public string main(IInputter inputter) 
    { 
    do 
    { 
     testBk = inputter.sendInput(); 
    } 
    while (testBk == null); 
    return testBk; 
    } 

그러나 Form1은 완전히로드되지 않습니다. 컨트롤이 있어야하는 빈 공간이 있으므로 함수를 통해 라이브러리 함수에 양식을 입력하는 방법이 없어도 While 루프가 무한대로 실행됩니다.

인터페이스가 양식에 구현 된 라이브러리 내에서 액세스 할 수있는 데이터 스트림을 설정하려면 더 많은 '기본 제공'방법이 있어야합니다. 나는 무엇을 놓치고 있습니까?

답변

4

양식이 있으므로 인터페이스는 이벤트 노출 더 의미 만들 것, 상호 작용 : 다음

public interface IInputter 
{ 
    event EventHandler<InputReceivedEventArgs> ReceivedInput; 
} 

public class InputReceivedEventArgs : EventArgs 
{ 
    public InputReceivedEventArgs(string text) 
    { 
     this.Text = text; 
    } 

    public string Text { get; private set; } 
} 

public partial class Form1 : Form, IInputter 
{ 
    public event EventHandler<InputReceivedEventArgs> ReceivedInput = delegate { }; 


    private void button1_Click(object sender, EventArgs e) 
    { 
     var dialog = new OpenFileDialog { Filter = "Excel files (*.xls*)|*.xls*" }; 
     var dialogResult = dialog.ShowDialog(); 
     if (dialogResult == DialogResult.OK) 
     { 
      ReceivedInput(this, new InputReceivedEventArgs(ofd.FileName)); 
      sentText = ofd.FileName; 
     } 
    } 
} 

를 소비하기 : 질문의

public string main(IInputter inputter) 
{ 
    string receivedInput = null; 

    inputter.ReceivedInput += (s, e) => YourLibrary.DoSomething(e.Text); 
} 
+0

커플 : 1. 왜'문자열을 사용 receivedInput = null' (불필요 해 보입니다)? 2. 이것을'string x '로 테스트하려고합니다. inputter.ReceivedInput + = (s, e) => x = e.Text; x + = "hello";'하지만 '할당되지 않은 지역 변수'x '를 사용하면 오류가 발생합니다. 3. 'Form1'에서'EventHandler ReceivedInput' 선언은 라이브러리에 대한 참조를 추가 했음에도 불구하고 'InputReceivedEventArgs'유형 또는 네임 스페이스 이름을 찾을 수 없습니다 '오류를 제공합니다. – sigil

관련 문제