2013-08-29 2 views
3

나는이 바보 같은 질문이고 용서할 수있는 긴 게시물을 용서한다면 아직 C#을 배우고 있습니다. 먼 길. TextChanged 이벤트에서 열린 양식의 열린 양식에 정보 전달

내 시나리오 : 나는 내 응용 프로그램에 대한 DockPanel Suite 사용하고

와 나는 ParentFormNotesFormBrowserForm (나는 실제로 BrowserForm 종류의 꽤 몇 가지 더 가지고 있지만 나는 그것이 하나에 작업을 얻을 수 있다면 내가해야 이

그래서 응용 프로그램에서 ParentForm로드를 시작하고로드 할 때 그것은 NotesFormBrowserForm ParentForm에서 버튼 클릭 이벤트를 통해로드 된 다음 해당 인스턴스가 열려 있고 숙박을로드)을 다른 사람에게 일을 할 수있을 열리고 닫히지 않을 것이다.

그래서 나는 NotesForm에 정보를 입력 할 때 이미 3 개의 양식으로 된 모든 인스턴스를 보유하고 있습니다.

내 목표는 내가 될 생각 것 NotesForm 아무 것도 클릭하지 않고 BrowserFormnotesText를 호출 문자열 변수에 NotesFormtextBox1에 입력 된 정보를 수 있습니다 얻는 것입니다 (나는 문제 먹으 렴 생각) TextChanged 이벤트를 통해

현재 속성 (가져 오기, 설정)을 사용하여 양식에 대한 정보를 얻을 수 있지만 NotesFormBrowserForm 버튼을 클릭해야합니다.

내가 지금 현재 어떻게하고 있는지 보여주는 일종의 무능력한 코드가 포함되어 있습니다. 내 전체 코드가 상당히 크기 때문에 혼란을 줄이고 내가 무엇을하는지에 대한 개념을 보여 주려고합니다.

부모 폼

public partial class parentForm : Form 
{ 
    private notesForm notesForm = new notesForm(); 
    public parentForm() 
    { 
     InitializeComponent(); 

    } 
    private void parentForm_Load(object sender, EventArgs e) 
    { 
     notesForm.Show(mainDock, DockState.DockLeft); 

    } 
    private void tb1_Click(object sender, EventArgs e) 
    { 
     BrowserForm.notesText= notesForm.passInfo; 
    } 

NotesForm

public partial class notesForm : DockContent 
{ 
    private string _passInfo; 
    public notesForm() 
    { 
     InitializeComponent(); 

    } 
    public string passInfo 
    { 
     get { return textBox1.Text; } 
     set 
     { 
      _passInfo = value; 
      textBox1.Text = _passInfo; 
     } 
    } 

} 

BrowserForm

public partial class BrowserForm : DockContent 
{ 
    private string passInfo; 
    public BrowserForm() 
    { 
     InitializeComponent(); 

    } 
      public string passInfo 
    { 
     get 
     { 
      return _passInfo; 
     } 
     set 
     { 
      _passInfo = value; 
      notesText = _passInfo; 
     } 

    } 
    string notesText; 
    private void button1_Click(object sender, EventArgs e) 
    { 
    MessageBox.Show(notesText); 
    } 
    } 

} 

현재 작동하지만 작동하도록하려면 상위 폼의 단추를 클릭 한 다음 browserform을 클릭해야합니다. 이상 적으로 노트 양식의 텍스트 상자에 정보를 입력 한 후 정보를 브라우저 양식으로 전달해야합니다. 텍스트 상자에 입력되는 정보가 정적 인 경우 도움이되면 항상 9 자 길이로 숫자 (전화 번호)로 구성됩니다.

또한 내 응용 프로그램의 배경에 대해서도 설명합니다. 제 일자리로 사용하여 인트라넷의 다양한 도구에 액세스합니다. 자동 로그인하면 40-80 개의 서로 다른 브라우저 창이 열리는 것과 달리 하나의 응용 프로그램으로 통합되므로 궁극적으로 해당 도구에서 일부 정보를 자동으로 긁어서 페이지를 검색 할 필요가 없습니다. 도구가 자동으로 잡아 당깁니다. 이것은 악의가 없으며 스팸 발송자가 아니며 서비스 제공을 위해 8-10 개의 도구가있는 10 개의 다른 회사에 대해 ISP 기술 지원을 수행합니다.

이 도움이 필요하거나 도움을받을 수있는 더 쉬운 방법이 있다면 내가 듣기에 행복 할 것입니다. 또한 내 전체 코드를보고 싶다면 (도움이된다면) 알려 주시면 게시하는 것이별로 귀찮은 일입니다.

+1

거룩한 벽의 텍스트 Ben Affleck – Jonesopolis

+0

@Jonesy Lol I kno 아마 미안해.하지만 더 이상 그 성가신 짧은 질문에 아무 의미가 죽여. – Nabbic

답변

2

내가 질문을 바로 가지고 있는지 확실하지 않습니다. 한 아이 양식에서 다른 아이 양식으로 정보를 전달하고자한다고 가정합니다.

같은 것 그 일을하는 한 가지 방법 :

1.이 같은 인터페이스를 만들기 :

public interface IDataContainer 
{ 
    void SetData(String data); 
} 

2. 보자 당신의 parentForm 사용자 인터페이스를 구현합니다

public partial class parentForm : Form, IDataContainer 

그리고 메소드에 양식 클래스의 구현을 제공하십시오. 이 간단한 인터페이스는 구현 자들이 어떤 목적 으로든 (문자열) 데이터를 저장할 수있게 해준다.

public partial class parentForm : Form, IDataContainer 
[...] 

public void SetData(String dataComingFromOtherSource) 
{ 
    this.browserFormInstance.passInfo = dataComingFromOtherSource; 
} 
[...] 

3. 추가 : 케이스 SetData 방법의 구현이 깨끗한 방법에, 양식간에 데이터를 전달하는 notesForm 당신의 BrowserForm에 CONECTING, 다리 역할을에서

매개 변수 IDataContainer을 각각 자식 폼의 생성자에 입력하여 IDataContainer 구현 (사용자의 parentForm)에 대한 참조를 전달할 수 있도록합니다. 이러한 방법 :

public partial class parentForm : Form 
{ 
    private notesForm notesForm = null; 

    public parentForm() 
    { 
     InitializeComponent(); 

     // Note that at this point you are instantiating 
     // the child-form and you are passing a reference 
     // to the `parentForm` so that you can pass information 
     // to it, and from it to whatever other form you may 
     // need, in an elegant way. 
     this.notesForm = new notesForm(this); 
    } 

4. 마지막으로, notesForm에, 당신의 container의 데이터를 설정하는 논리를 넣어 :

public partial class notesForm : DockContent 
{ 
    // On runtime this will in fact the `parentForm` object instance. 
    IDataContainer myDataContainerInstance = null; 

    public notesForm(IDataContainer myDataContainerInstance) : base() 
    { 
     InitializeComponent(); 

     // Assign the reference so that you can use it later 
     this.myDataContainerInstance = myDataContainerInstance; 

     textBox1.TextChanged += new EventHandler(textBox1_TextChanged); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     this.myDataContainerInstance.SetData(textBox1.Text); 
    } 
} 

참고 :는 정적 클래스/싱글를 갖는 또한 해결 방법이 될 것이고 훨씬 더 간단 할 것입니다 ...

+0

이것은 훌륭합니다. 이것은 정확하게 내 프로그램을 위해 전체적으로 찾고있는 유형입니다. 속성을 사용하면 전달해야 할 여러 가지 양식이 있고 모든 다른 인스턴스가 나에게 두통을 줄 때 조금 더러워집니다. 나는 과거에 이런 일을 시도했지만 제대로 작동하지 못했습니다. 고마워요. 저는 오늘 밤 이걸 시도하고 구현할 것입니다! – Nabbic

+0

들으니 기쁘다;) 구현이 잘 되었다면 알려주십시오. –

+1

아하 그것이 일했습니다! 굉장한 감사!! 근본적 으로이 방식으로 모든 것을 다시 작성하자.지루하지만 지루한 일이지만 코드에서 계속 진행되는 것을 더 쉽게 이해할 수 있습니다. – Nabbic

1

예,이처럼 NotesForm에 TextChanged 이벤트를 연결해야합니다

public partial class notesForm : DockContent 
{ 
    public notesForm() 
    { 
     InitializeComponent(); 
     textBox1.TextChanged += new EventHandler(textBox1_TextChanged); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     // Get value of text box here and either pass it to the Browser form 
     // via its constructor or get an instance of the Browser form and use 
     // the set of a property in the Browser form to store the value 
     string theTextBoxValue = textBox1.Text; 
    } 
} 
+0

@ Karl 나는 이것이 내가 찾고 있었던 것이라고 믿는다 (이벤트에 대한 많은 경험이 없다) 고마워! 어떻게 생성자를 통해 전달합니까? – Nabbic

관련 문제