C\#창 간 통신 의 몇 가지 상용 처리 방법 요약

C\#응용 프로그램 개발 을 하 는 과정 에서 다 중 창 간 에 데이터 통신 을 해 야 한다.본 고 는 몇 가지 예 를 들 어 자주 사용 하 는 통신 방식 을 정리 하고 창 인터페이스 는 다음 과 같다. 

주 창 Form 1 은 ListBox 입 니 다.선택 한 열 을 누 르 면 창 Form 2,Form 2 의 두 컨트롤 이 팝 업 됩 니 다.하 나 는 TextBox 입 니 다.선택 한 열 텍스트 를 표시 하고 다른 하 나 는 단 추 를 누 르 면 수 정 된 값 을 되 돌려 주 며 Form 1 에서 해당 열 텍스트 를 수정 하고 Form 2 를 닫 습 니 다.
방법 1:전송 값
가장 먼저 생각 나 는 것 은 Form 2 구조 함수 에서 string 형식 인 자 를 받 습 니 다.즉,Form 1 에서 선택 한 줄 의 텍스트 입 니 다.Form 2 의 TextBox 컨트롤 의 Text 를 이 string 으로 설정 하면 Form 1 에서 Form 2 로 전달 하 는 값 이 완 료 됩 니 다.Form 2 의 AcceptChange 단 추 를 누 르 면 Form 1 의 Listbox 에 해당 하 는 열의 값 을 수정 해 야 하기 때문에 Form 1 의 Listbox 컨트롤 을 매개 변수 로 Form 2 에 전송 하 는 것 을 고려 할 수 있 습 니 다.모든 수정 작업 은 Form 2 에서 이 루어 집 니 다.이 사고방식 에 따라 Form 2 코드 는 다음 과 같 습 니 다.

publicpartial class Form2 : Form 
{ 
    private string text; 
    private ListBox lb; 
    private int index; 
 
    //          :     ,ListBox  ,      
    public Form2(string text,ListBox lb,int index) 
    { 
      this.text = text; 
      this.lb = lb; 
      this.index = index; 
      InitializeComponent(); 
      this.textBox1.Text = text; 
    } 
 
    private void btnChange_Click(object sender, EventArgs e) 
    {       
 
      string text = this.textBox1.Text; 
      this.lb.Items.RemoveAt(index); 
      this.lb.Items.Insert(index, text); 
      this.Close(); 
    } 
}

Form 1 에서 new 창 2 를 이렇게 씁 니 다.

public partial class Form1 :Form 
{ 
    int index = 0; 
    string text = null; 
    public Form1() 
    { 
      InitializeComponent(); 
    } 
 
    private void listBox1_SelectedIndexChanged(object sender, EventArgse) 
    { 
      if (this.listBox1.SelectedItem != null) 
      { 
        text = this.listBox1.SelectedItem.ToString(); 
        index = this.listBox1.SelectedIndex; 
 
        //  Form2       
        Form2 form2 = new Form2(text, listBox1, index); 
        form2.ShowDialog(); 
      } 
    } 
}

OK.방법 1 의 해결 방법 은 바로 이 렇 습 니 다.장점 은 직관 적 이 고 필요 한 것 을 전달 하 는 것 입 니 다.단점 도 분명 합 니 다.만약 에 창문 1 에서 수정 해 야 할 것 이 100 개의 컨트롤 이 라면 구 조 를 할 때 100 개의 매개 변 수 를 전달 하 는 것 입 니까?게다가 다른 창 이 Form 2 를 쳐 야 한다 면 Form 2 는 폐기 되 고 창 1 만 사용 할 수 있 습 니 다.다시 불 러 오 는 구조 함 수 를 쓰 지 않 으 면 코드 의 재 활용 에 불리 하고 다음 방법 을 계속 볼 수 있 습 니 다.
방법 2:계승
이 방법 은 제 가 여러 번 시도 해 봤 는데 계승 은 할 수 있 지만 귀 찮 고 불편 하기 때문에 개인 적 으로 서로 데 이 터 를 조작 하기 위해 계승 을 사용 하 는 것 은 적절 하지 않다 고 생각 합 니 다.하지만 방법 이 라면 던 져 보 세 요.실제 역할 개 그 는 0 입 니 다.
Form 2 창:

//  Form2   Form1 
 
public partial classForm2 : Form1 
{ 
     publicint index; 
 
    public ListBox lb; 
    public Form2(string text) 
    {  
 
      //      listBox       
 
      this.listBox1.Visible=false; 
      InitializeComponent(); 
      this.textBox1.Text = text; 
    } 
    private void btnChange_Click(object sender, EventArgs e) 
    { 
      string text = this.textBox1.Text; 
      this.lb.Items.RemoveAt(index); 
      this.lb.Items.Insert(index,text);      
      this.Close(); 
 
    } 
}
Form 1 창:

public partial class Form1 :Form 
{ 
    public int index = 0; 
    public string text = null; 
    public Form1() 
    { 
      InitializeComponent(); 
    } 
 
    private void listBox1_SelectedIndexChanged(object sender, EventArgse) 
    { 
      if (this.listBox1.SelectedItem != null) 
      { 
        text = this.listBox1.SelectedItem.ToString(); 
        index = this.listBox1.SelectedIndex; 
        Form2 form2 = new Form2(text); 
 
        //   Form2 , Form2       
        form2.lb =this.listBox1;         
        form2.index = index; 
        form2.Show(); 
      } 
    } 
}
여기에 몇 가지 문제 가 있 습 니 다.Form 2 의 각 속성 은 어떤 할당 방법 이 필요 합 니까?자바 가 과도 하 게 왔 다 는 것 을 잘 알 고 있 습 니 다.자바 계승 에서 하위 클래스 에서 키 슈퍼 를 사용 하면 기본 클래스 에서 공유 하 는 방법 과 매개 변 수 를 방문 할 수 있 습 니 다.C\#중 슈퍼 는 base 로 바 뀌 었 습 니 다.그것 은 우리 가 Form 2 에서 이렇게 매개 변 수 를 할당 할 수 있다 는 것 을 의미 하 는 것 입 니까?

this.lb=base.listBox1; 
 
this.index=base.index; 
OK,두 번 째 쓰 기 는 괜 찮 습 니 다.index 값 을 저장 할 수 있 습 니 다.그러나 Listbox 컨트롤 에 대해 이렇게 할당 하면 문제 가 발생 합 니 다.테스트 를 통 해 base.listbox 1 이 가리 키 는 것 은 하위 클래스 가 계승 한 listbox 1 대상 이 고 기본 클래스 의 listbox 1 대상 이 아 닙 니 다.그래서 우 리 는 그 base.index 값 도 하위 클래스 를 가리 키 는 index 가 아 닐 까 추측 합 니 다.테스트 해 보 니 그 렇 기 때문에 this.index=base.index 는 쓰 지 않 은 것 과 같 습 니 다.지 워 도 사용 할 수 있 습 니 다.index 처럼 Form 2 에 의 해 계승 되 었 기 때문에 C\#의 창 이 계승 되 고 base.컨트롤 을 통 해 기본 컨트롤 을 조작 할 수 없습니다.
방법 3:이벤트 리 셋
C\#이벤트 라 는 것 이 있 는데 왜 사용 하지 않 습 니까?그리고 사건 은 창 통신 에 있어 더욱 편리 한 역할 을 합 니 다.우 리 는 사건 이 실제 적 으로 상태의 캡 처 라 는 것 을 알 고 있 습 니 다.마지막 으로 저 는 캡 처 상태의 예 를 들 어 데이터 가 서로 작 동 하 는 예 를 먼저 보 겠 습 니 다.
Form 2 창:

//      string        
publicdelegate void MyDelegate(string text); 
public partial class Form2 :Form1 
{ 
    //         
    public event MyDelegate MyEvent; 
    public Form2(string text) 
    {  
      InitializeComponent(); 
      this.textBox1.Text = text; 
    } 
    private void btnChange_Click(object sender, EventArgs e) 
    { 
 
      //    ,           
      MyEvent(this.textBox1.Text); 
      this.Close(); 
    } 
} 
Form 1 창:

public partial class Form1 :Form 
{ 
    public int index = 0; 
    public string text = null; 
    public Form1() 
    { 
      InitializeComponent(); 
    } 
 
    private void listBox1_SelectedIndexChanged(object sender, EventArgse) 
    { 
      if (this.listBox1.SelectedItem != null) 
      { 
        text = this.listBox1.SelectedItem.ToString(); 
        index = this.listBox1.SelectedIndex; 
        Form2 form2 = new Form2(text); 
 
        //  form2_MyEvent   MyEvent   
        form2.MyEvent += new MyDelegate(form2_MyEvent); 
        form2.Show(); 
      } 
    } 
 
    //   
 
    void form2_MyEvent(string text) 
    { 
      this.listBox1.Items.RemoveAt(index); 
      this.listBox1.Items.Insert(index, text); 
    } 
}
이 를 통 해 알 수 있 듯 이 사건 을 사용 하 는 것 이 편리 하고 그렇게 많은 파 라 메 터 를 전달 할 필요 가 없 으 며 계승 관계 가 필요 하지 않 으 며 코드 재 활용 도 향상 시 켰 기 때문에 일반적인 수요 에서 이렇게 사용 하 는 것 을 권장 합 니 다.

좋은 웹페이지 즐겨찾기