熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

.Net中掌握Windows窗體間數據交互(2)

2013-11-23 19:09:57  來源: Java核心技術 

  《Net中掌握Windows窗體間數據交互()》一文中我們講了使用帶參數的構造函數來實現窗體間的數據傳遞我認為是用的比較多的一種接下來讓我們看看另外兩種實現方法
  
  二.給窗體添加屬性或方法
  
  .使用Form類的Owner屬性
  獲取或設置擁有此窗體的窗體若要使某窗體歸另一個窗體所有請為其 Owner 屬性分配一個對將成為所有者的窗體的引用當一個窗體歸另一窗體所有時它便隨著所有者窗體最小化和關閉例如如果 Form 歸窗體 Form 所有則關閉或最小化 Form也會關閉或最小化 Form並且附屬窗體從不顯示在其所有者窗體後面可以將附屬窗體用於查找和替換窗口之類的窗口當選定所有者窗體時這些窗口不應消失若要確定某父窗體擁有的窗體請使用OwnedForms屬性
  
  上面是SDK幫助文檔上講的下面我們就來使用它
  
  首先還是使用第一篇文章中的第二個例子窗體如下
  

  說明在這個例子中我們的兩個窗體都加了一個ListBox用來顯示ArrayList中的內容
  
  主窗體中控件listBoxFrmbuttonEdit
  子窗體中控件listBoxFrmtextBoxAddbuttonAddbuttonEditbuttonOK
  
  主窗體中還是定義類數據成員
  private ArrayList listData;
  
  在構造函數裡實例化它填充數據最後綁定到listBoxFrm
  
  構造函數如下
  
  public Form()
  {
  InitializeComponent();
  thislistData = new ArrayList();
  thislistDataAdd(DotNet);
  thislistDataAdd(C#);
  thislistDataAdd();
  thislistDataAdd(WebService);
  thislistDataAdd(XML);
  thislistBoxFrmDataSource = thislistData;
  }
  
  主窗體的修改按鈕處理函數
  
  private void buttonEdit_Click(object sender SystemEventArgs e)
  {
  Form formChild = new Form();
  formChildOwner = this;
  formChildShowDialog();
  thislistBoxFrmDataSource = null;
  thislistBoxFrmDataSource = thislistData;
  }
  
  我們設置了formChildOwner為this這樣子窗體和主窗體就有聯系了
  
  當然我們也可以改成如下
  
  private void buttonEdit_Click(object sender SystemEventArgs e)
  {
  Form formChild = new Form();
  formChildShowDialog(this);
  thislistBoxFrmDataSource = null;
  thislistBoxFrmDataSource = thislistData;
  }
  
  不過這樣還不行目前主窗體的listData變量外部訪問不到
  
  private ArrayList listData;
  
  必須修改為public訪問修飾符
  
  public ArrayList listData;
  
  也可以通過屬性(property)來實現
  
  public ArrayList ListData
  {
  get{return thislistData;}
  }
  
  這裡我采用屬性感覺語法更靈活清楚
  
  下面是對Form的修改
  
  構造函數又恢復原貌了
  
  public Form()
  {
  InitializeComponent();
  }
  
  另外又新增了一個窗體的Load事件在它的事件處理函數中來獲取主窗體中的數據
  
  private void Form_Load(object sender SystemEventArgs e)
  {
  Form pareForm = (Form)thisOwner;
  thislistData = pareFormListData;
  foreach(object o in thislistData)
  thislistBoxFrmItemsAdd(o);
  }
  
  有人會問為什麼不把上面的代碼放到構造函數裡面去呢?如下不是更好
  
  public Form()
  {
  InitializeComponent();
  Form pareForm = (Form)thisOwner;
  thislistData = pareFormListData;
  foreach(object o in thislistData)
  thislistBoxFrmItemsAdd(o);
  }
  
  那我會對你說錯了因為在主窗體修改按鈕被點擊後開始執行
  
  Form formChild = new Form();
  
  而在Form的實例化過程中會在構造函數中執行
  
  Form pareForm = (Form)thisOwner;
  
  而這時的thisOwner是沒有值的為空引用那麼下面的代碼肯定也出問題
  
  thislistData = pareFormListData;
  foreach(object o in thislistData)
  thislistBoxFrmItemsAdd(o);
  
  當整個Form實例化完成後才會執行
  
  formChildOwner = this;
  
  這條代碼所以使用了Form_Load事件
  
  那怎樣可以不使用Form_Load事件呢?等下面我們來修改代碼實現它
  
  下面的子窗體代碼沒有變化
  
  private void buttonAdd_Click(object sender SystemEventArgs e)
  {
  if(thistextBoxAddTextTrim()Length>)
  {
  thislistDataAdd(thistextBoxAddTextTrim());
  thislistBoxFrmItemsAdd(thistextBoxAddTextTrim());
  }
  else
  MessageBoxShow(請輸入添加的內容!);
  }
  private void buttonDel_Click(object sender SystemEventArgs e)
  {
  int index = thislistBoxFrmSelectedIndex;
  if(index!=)
  {
  thislistDataRemoveAt(index);
  thislistBoxFrmItemsRemoveAt(index);
  }
  else
  MessageBoxShow(請選擇刪除項!);
  }
  private void buttonOK_Click(object sender SystemEventArgs e)
  {
  thisClose();
  }
  
  好了結果同第一篇中的一樣子窗體能修改主窗體的值
  
  .使用自定義屬性或方法
  下面我們來講講怎樣使用自定義屬性或方法來完成數據修改功能而不使用Form_Load事件
  
  主窗體的修改按鈕點擊處理函數如下
  
  private void buttonEdit_Click(object sender SystemEventArgs e)
  {
  Form formChild = new Form();
  formChildListData = thislistData;
  formChildShowDialog();
  thislistBoxFrmDataSource = null;
  thislistBoxFrmDataSource = thislistData;
  }
  
  並且我們去掉了主窗體的ListData屬性
  
  //public ArrayList ListData
  //{
  //  get{return thislistData;}
  //}
  
  而在子窗體中加上ListData屬性
  
  public ArrayList ListData
  {
  set
  {
  thislistData = value;
  foreach(object o in thislistData)
  thislistBoxFrmItemsAdd(o);
  }
  }
  
  也可以把屬性改成方法
  
  public void SetListData(ArrayList listData)
  {
  thislistData = listData;
  foreach(object o in thislistData)
  thislistBoxFrmItemsAdd(o);
  }
  
  而在主窗體的修改按鈕處理函數中也要相應改動
  formChildListData = thislistData;
  
  改為
  formChildSetListData(thislistData);
  
  總結我們通過Form類的Owner屬性來建立主從窗體間的橋梁這個是不是類似於把主窗體作為子窗體的構造函數參數傳入實現的功能差不多另外又采用了屬性和方法來完成數據的交互我覺得這種實現方法很實用特別是用在不需要實例化類或著已經有了實例的情況下傳遞數據下一篇文章我們來講如何使用靜態類來完成數據的交互

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26383.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.