通過事件同步兩個窗體之間的資料

2021-05-24 01:07:08 字數 2420 閱讀 9899

一、應用場景

一窗體(forma)採用datagridview 等資料顯示控制項顯示資料,需要雙擊其中的資料在另乙個窗體(formb)顯示其詳細資訊並可以進行修改,當其修改完畢後,forma窗體顯示更新過的資料,每當在fromb中新增的資料都能實時的顯示在forma的資料顯示控制項中。

二、解決方案思考

我們不難看出,其實我們要求的結果就是當formb完成操作以後能回傳forma乙個資訊,告訴他完成的什麼操作,和是否完成,forma根據返回的狀態資訊,來決定自己需要做些什麼。

1、設定formb為showdialog方式開啟,操作完成後返回窗體狀態,forma通過判斷窗體的窗體來決定是否重新重新整理資料。

缺點:重新整理資料可能需要重新載入資料,對於從資料庫中載入來說,大資料量將會是噩夢,而且因為是showdialog方式開啟,在進行修改等操作時,其他操作其他窗體,必須等待完成。

2、在forma窗體中定義運算元據顯示控制項的委託方法,在開啟formb窗體時,將委託例項傳遞給fromb,在formb完成修改等操作時,呼叫委託方法,實現實時修改顯示。

缺點:當forma關閉時,委託呼叫會失敗,但解決了第一種方案的問題。

3、通過事件來同步更新資料,這篇文章主要簡單介紹如何通過事件來解決我們這個問題,下面將詳細講下方法。

三、通過事件完成更新操作

步驟:

1、在formb中定義委託和相應事件,**如下:

/// 

/// 新增新行完成後

///

/// 新行資料

public

delegate

void completeaddhandler(string newrowdata);

///

/// 修改資料完成後

///

/// 修改過後的資料

/// 在datagridview中的行索引

public

delegate

void completeedithandler(string editrowdata, int rowindex);

//以下定義事件

public

event completeaddhandler completeaddeventhandler;

public

event completeedithandler completeediteventhandler;

.csharpcode, .csharpcode pre

.csharpcode pre

.csharpcode .rem

.csharpcode .kwrd

.csharpcode .str

.csharpcode .op

.csharpcode .preproc

.csharpcode .asp

.csharpcode .html

.csharpcode .attr

.csharpcode .alt

.csharpcode .lnum

-->

2、在完成操作後呼叫事件**,比如以下**:

1:  

private

void button1_click(object sender, eventargs e)

2:

注:這裡if(completeediteventhandler!=null)是判斷有哪個窗體訂閱了這個事件。

3、然後在forma中呼叫formb的時候這樣寫:

1:  

private

void button2_click(object sender, eventargs e)

2:          ;
7:                  mothedform editform = new mothedform(edit, dr.index);
8:                  editform.completeediteventhandler += new mothedform.completeedithandler(editform_completeediteventhandler);
9:                  editform.show();
10:              }
11:          }

這裡定義了處理事件,在forma中的editform_completeediteventhandler中處理那邊觸發了事件傳遞過來的資料,我們要做的就是把接收過來的資料放到我們要顯示的控制項上。

四、小結

有問題的也可以跟貼提出,大家一起學習。

附件:http://u.115.com/file/f4e7af9506

關於兩個窗體之間交換資料

學習.net不短時間了,最近做的乙個東西需要用到在幾個窗體之間進行通訊。類似於一般軟體的設定這個選項卡,開啟時候進行一些基本引數的設定,然後主程式會根據這些引數作出反映。之前我採取的方法是在主窗體類中建立乙個子窗體的例項。然後把要傳遞的子窗體引數設定為public,這樣在主窗體中就可以呼叫了。這樣做...

兩個窗體之間傳遞物件

public archiext archiidgetinfo string archiid return objext catch exception ex 比如 我在窗體a中有個查詢的結果集 根據結果集中的序號來點選修改,就顯示資料庫中相對應的內容 首先呢,我們要寫個方法返回乙個物件,public...

兩個窗體之間的checkbox傳遞

例如有乙個窗體a 和乙個窗體b a上有乙個checkbox b 上也有乙個checkbox 執行a窗體勾選chk後調整b窗體 然後b窗體上的checkbox也被勾選上 在a窗體load事件中迴圈遍歷窗體上的checkbox 新增到list集合 a窗體listlist new list private...