C\#창 간 통신 의 몇 가지 상용 처리 방법 요약
6798 단어 C#창문커 뮤 니 케 이 션
![](https://s1.md5.ltd/image/2dc91dc9dc16bcad63e51e5dcfc479a6.jpg)
주 창 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);
}
}
이 를 통 해 알 수 있 듯 이 사건 을 사용 하 는 것 이 편리 하고 그렇게 많은 파 라 메 터 를 전달 할 필요 가 없 으 며 계승 관계 가 필요 하지 않 으 며 코드 재 활용 도 향상 시 켰 기 때문에 일반적인 수요 에서 이렇게 사용 하 는 것 을 권장 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.