1、應用場景
一窗體(FormA)採用datagridview 等數據顯示控件顯示數據,須要雙擊其中的數據在另外一個窗體(FormB)顯示其詳細信息並能夠進行修改,當其修改完畢後,FormA窗體顯示更新過的數據,每當在FromB中添加的數據都能實時的顯示在FormA的數據顯示控件中。
2、解決方案思考
web
咱們不難看出,其實咱們要求的結果就是當FormB完成操做之後能回傳FormA一個信息,告訴他完成的什麼操做,和是否完成,FormA根據返回的狀態信息,來決定本身須要作些什麼。3、經過事件完成更新操做
一、設置FormB爲ShowDialog方式打開,操做完成後返回窗體狀態,FormA經過判斷窗體的窗體來決定是否從新刷新數據。
缺點:刷新數據可能須要從新載入數據,對於從數據庫中載入來講,大數據量將會是噩夢,並且由於是ShowDialog方式打開,在進行修改等操做時,其餘操做其餘窗體,必須等待完成。
二、在FormA窗體中定義操做數據顯示控件的委託方法,在打開FormB窗體時,將委託實例傳遞給FromB,在FormB完成修改等操做時,調用委託方法,實現實時修改顯示。
缺點:當FormA關閉時,委託調用會失敗,但解決了第一種方案的問題。
三、經過事件來同步更新數據,這篇文章主要簡單介紹如何經過事件來解決咱們這個問題,下面將詳細講下方法。
一、在FormB中定義委託和相應事件,代碼以下:4、小結
/// <summary> /// 添加新行完成後 /// </summary> /// <param name="newRowData">新行數據</param> public delegate void CompleteAddHandler(string[] newRowData); /// <summary> /// 修改數據完成後 /// </summary> /// <param name="editRowData">修改事後的數據</param> /// <param name="rowIndex">在datagridview中的行索引</param> public delegate void CompleteEditHandler(string[] editRowData, int rowIndex); //如下定義事件 public event CompleteAddHandler CompleteAddEventHandler; public event CompleteEditHandler CompleteEditEventHandler;注:這裏只是個示例,你們能夠根據本身的實際狀況來定義委託和事件,來完成相應的操做。
二、在完成操做後調用事件代碼,好比如下代碼:
1: private void button1_Click(object sender, EventArgs e) 2: { 3: ///上面完成修改操做 4: if (CompleteEditEventHandler != null) 5: CompleteEditEventHandler(editedRowData, RowIndex); 6: }
注:這裏if(CompleteEditEventHandler!=null)是判斷有哪一個窗體訂閱了這個事件。 三、而後在FormA中調用FormB的時候這樣寫:
1: private void button2_Click(object sender, EventArgs e) 2: { 3: DataGridViewRow dr = this.dataGridView1.CurrentRow; 4: if (dr != null) 5: { 6: string[] edit = { dr.Cells[0].Value.ToString(),dr.Cells[1].Value.ToString(),dr.Cells[2].Value.ToString()}; 7: MothedForm editForm = new MothedForm(edit, dr.Index); 8: editForm.CompleteEditEventHandler += new MothedForm.CompleteEditHandler(editForm_CompleteEditEventHandler); 9: editForm.Show(); 10: } 11: }
這裏定義了處理事件,在FormA中的editForm_CompleteEditEventHandler中處理那邊觸發了事件傳遞過來的數據,咱們要作的就是把接收過來的數據放到咱們要顯示的控件上。
今天有點累,寫的不是不少,可是把大概過程寫出來了,可能有些問題我寫的不夠入木三分,也可能有我本身理解不對的地方,也歡迎你們指正。附件傳一下詳細的測試代碼,代碼註釋很詳細。 有問題的也能夠跟貼提出,你們一塊兒學習。