WinForm表單之間互動介紹

來源:互聯網
上載者:User

  我們在做程式的時候遇到WinForm表單之間互動的問題,這裡把各種方法總結一下,內容比較確基礎,適合剛入門的初學者,下面我們就一起來看看吧!

  在表單間傳遞資料的方法比較多:

  1,在子表單中自訂一個建構函式,參數類型是主表單,當要顯示子表單的時候,就用這個建構函式來執行個體化子表單,然後把this指標傳進去,說起來太抽象了,我大概一寫大家應該就明白了:

  publicclassfrmMain:Form

  {

  ...

  frmControlcontrolForm=newfrmControl(this);

  controlForm.Show();

  }

  publicclassfrmControl:Form//子表單,用來控制主表單的某些顯示!

  {

  privatefrmMainmainForm;

  publicfrmControl(frmMainmainForm)

  {

  this.mainForm=mainForm;

  }

  privatevoidbutton1_Click(objectsender,EventArgse)

  {

  frmMain.textBox1.Text=this.textBox1.Text;//把子表單的文字框值傳遞給主表單的文字框!

  }

  }

  2,我個人感覺上面的方法不是很好,雖然實現起來很簡單,只是想改變表單的標題文本,就把整個主表單的引用都傳遞給子表單,這樣的方式不是很幽雅,我們用介面來改進上面的方法,這樣可以限制暴露給子表單的功能,降低表單之間的耦合度:

  publicinterfaceIChangeTitle:

  {

  voidChangeTitle(stringtitle);

  }

  publicclassfrmMain:Form,IChangeTitle

  {

  ...

  frmControlcontrolForm=newfrmControl(this);

  controlForm.Show();

  publicvoidChangeTitle(stringtitle)

  {

  this.Text=title;

  }

  }

  publicclassfrmControl:Form//子表單,用來控制主表單的某些顯示!

  {

  privateIChangeTitleichangeTitle;

  publicfrmControl(IChangeTitleichangeTitle)

  {

  this.ichangeTitle=ichangeTitle;

  }

  privatevoidbutton1_Click(objectsender,EventArgse)

  {

  ichangeTitle.ChangeTitle(this.textBox1.Text);//通過介面來調用方法

  }

  }

  3,為了進一步降低表單之間的耦合度,我們可以用委託來實現這個需求:

  publicpartialclassChildForm:Form

  {

  publicdelegatevoidTitleChangedHandler(stringtitle);

  publicTitleChangedEventHandlerTitleChanged;

  publicChildForm()

  {

  InitializeComponent();

  }

  privatevoidbtn_Ok_Click(objectsender,EventArgse)

  {

  if(TitleChanged!=null)

  TitleChanged("TestTitle");//委託調用

  }

  }

  主表單給委託變數賦值就可以了:

  publicpartialclassMainForm:Form

  {

  privateChildFormloginForm=newChildForm();

  publicMainForm()

  {

  InitializeComponent();

  loginForm.TitleChanged=newChildForm.TitleChangedEventHandler(FormTitleChanged);

  }

  protectedvoidFormTitleChanged(stringtitle)

  {

  this.Text=title;

  }

  privatevoidbutton1_Click(objectsender,EventArgse)

  {

  loginForm.Show();

  }

  }

  4,也可以在子表單中定義一個自訂的事件,然後自訂一個事件參數,用來傳遞你想傳遞的一些資訊:

  publicpartialclassChildForm:Form

  {

  publicclassTitleChangedEventArgs:EventArgs//事件參數類

  {

  privatestringtitle="";

  publicstringTitle

  {

  get

  {

  returntitle;

  }

  set

  {

  title=value;

  }

  }

  }

  publicdelegatevoidTitleChangedEventHandler(objectsender,TitleChangedEventArgse);

  publiceventTitleChangedEventHandlerTitleChanged;

  publicChildForm()

  {

  InitializeComponent();

  }

  privatevoidbtn_Ok_Click(objectsender,EventArgse)

  {

  TitleChangedEventArgse1=newTitleChangedEventArgs();

  e1.Title="Loginsucessed";

  OnTitleChanged(e1);//觸發事件

  }

  protectedvirtualvoidOnTitleChanged(TitleChangedEventArgse)//觸發事件的方法

  {

  if(TitleChanged!=null)

  TitleChanged(this,e);

  }

  }

  主表單訂閱這個事件就可以了:

  publicpartialclassMainForm:Form

  {

  privateChildFormloginForm=newChildForm();

  publicMainForm()

  {

  InitializeComponent();

  loginForm.TitleChanged =newChildForm.TitleChangedEventHandler(FormTitleChanged);

  }

  protectedvoidFormTitleChanged(objectsender,ChildForm.TitleChangedEventArgse)

  {

  this.Text=e.Title;

  }

  privatevoidbutton1_Click(objectsender,EventArgse)

  {

  loginForm.Show();

  }

  }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.