深入理解C 程式設計中的元件 事件 委託

2021-03-31 12:47:40 字數 3522 閱讀 7301

在元件程式設計中對事件的理解是十分重要的,c# 中的「事件」是當物件發生某些有趣的事情時,類向該類的客戶提供通知的一種方法。與事件聯絡最為緊密的,個人認為是委託.委託可以將方法引用封裝在委託物件內。為了弄清元件-事件-委託三者的關係,本人用實際的例子來談 談小弟的理解。

首先建立乙個windows控制項專案,新增如下控制項樣板。

當事件觸發時,會傳遞乙個eventargs型別的引數給事件處理方法,為了能傳遞自定義的資訊,我們可以建立乙個繼承於eventargs的事件引數 類,其定義如下:

public class eventloginargs:system.eventargs

再宣告兩個委託,它們是對eventloginargs和eventargs物件中的資訊的封裝,如下:

public delegate void userlogineventhandler(object sender,eventloginargs e);

public delegate void canceleventhandler(object sender,eventargs e);

在元件中為了能讓使用者自定義某事件的處理方法,所以元件必需提供事件介面.如果只是繼承於單個已有的windows控制項,可以過載已知的方 法進行新增自己的處理,也可以宣告自定義的事件介面.而若元件中包含多個控制項,應該根據實際需要宣告事件介面,此處本人就兩個按鈕的 使用而宣告兩個自定義的事件介面,如下:

public event userlogineventhandler submitlogin;

public event canceleventhandler cancel;

protected virtual void onsubmitlogin(eventloginargs e) }

protected virtual void oncancel(eventargs e)

其實submitlogin 是userlogineventhandler委託的例項,令人費解的是此事件的觸發,傳遞,處理過程如何呢?

在本例中是通過確定按鈕來觸發submitlogin事件的:

private void btnok_click(object sender, system.eventargs e)

else }

注意本例中的對話方塊是為了幫助了解事件的過程,真正有用的是第二個例子。

在btnok_click事件響應中,先對進行簡單的有效性檢查,建議實際工作應作加強完善.intlogintime變數是嘗試登入的次數.testuserindb是 通過已知資訊在資料庫中搜尋出有關記錄進行判斷使用者是否合法. 因為元件的測試是通過客戶程式的,所以應該建立乙個最簡單明瞭的客戶 程式.這是乙個windows應用程式,將編譯好的元件新增到使用者控制項欄中,拖出到工作區中,新增submitlogin事件的響應程式,如下:

private void usercontrol1_submitlogin(object sender, userlogin.eventloginargs e)

此時執行客戶程式可得以下結果:

this is in test form!

this is the process in db

this is the btnok_click function!

結果表明單擊btnok按鈕時執行元件中的onsubmitlogin(new eventloginargs(txtid.text,txtname.text,txtpwd.text)),此方法又呼叫 submitlogin(this,e),從而激發submitlogin事件,usercontrol1_submitlogin就進行響應,故列印第一行。

跟著是執行testuserindb,它列印出第二行。

最後是返回到btnok_click中輸出最後一行。

注意若btnok_click中的onsubmitlogin和testuserindb所在的行調換位置,其結果是不同的.第二個例子中,二者的位置調換,先進行資料庫 查詢判斷,再在submitlogin的事件響應usercontrol1_submitlogin中處理結果,下面的是例子二的主要**:

public delegate void userlogineventhandler(object sender,eventloginargs e);

public delegate void canceleventhandler(object sender,eventargs e);

public event userlogineventhandler submitlogin;

public event canceleventhandler cancel;

protected virtual void onsubmitlogin(eventloginargs e) }

protected virtual void oncancel(eventargs e)

public string server

public string database

public string tableset

public string userfordb

public string pwdfordb

public bool testuserindb(eventloginargs e)

catch(sqlexception ex)

sqldataadapter da = new sqldataadapter(strsql,conn);

dataset ds = new dataset();

try

catch(sqlexception ex)

foreach(datarow row in ds.tables[this.strtableset].rows) }

.......

} else

return bok;

} private void btnok_click(object sender, system.eventargs e)

else }

private void btncancel_click(object sender, system.eventargs e)

private void usercontrol_load(object sender, system.eventargs e) }

public class eventloginargs:system.eventargs }

它的客戶程式主要如下:

private void usercontrol1_submitlogin(object sender, userlogin.eventloginargs e)

private void form1_load(object sender, system.eventargs e)

讀者可以參考學習,也可直接使用此元件,但使用時應當以microsoft sql server 作為後台資料庫,所用到的使用者**應有 userid,username,userpwd三列,同時在客戶程式中應對有關引數初始化,submitlogin事件返回值是嘗試次數intlogintime和驗證是否成功blogin,可參考擴充套件例子二。

深入理解C 中的委託和事件 委託的定義

委託和事件在 net framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡別 bi 得慌,混身不自在。本文中,我將通過兩個範例由淺入深地講述什麼是委託 為...

深入理解C 窗體關閉事件

目錄 很多初學者都想把預設的c 關閉按鈕事件弄明白,主要用在我想關閉視窗但是我還想在關閉前有乙個提示,可是網上真的有太多的答案都是錯的,今天在這裡從頭到尾給大家設定一下,希望可以幫到大家。名號命名好後,雙擊這個yfeuttcehh名字就可以對這個事件進行編輯了,找不到的就可以進入.cs檔案自己檢視 ...

C 中深入理解dynamic cast

一 指標型別的dynamic cast 如果一條dynamic cast語句的轉換目標是指標型別並且轉換失敗了,會返回乙個空指標,則判斷條件為0,即為false 如果轉換成功,指標為非空,則判斷條件為非零,即true。這樣做可以確保型別轉換和條件檢查在同一條表示式中完成 if derived pd ...