自定義控制項新增事件

2021-08-27 13:17:32 字數 3762 閱讀 4947

事件,委託,總是看起來有點繞,不過本文不介紹這些,只說說如何為自定義控制項新增自定義事件。

本文所說的自定義控制項,非繼承其他現有microsoft控制項或者組合控制項,而是完全繼承usercontrol的東西。

既然不是繼承自其他現有控制項或者控制項組合,在特定需求下,有新增自定義事件的可能性,或者對繼承自usercontrol而得到的事件進行些許擴充套件,以期以簡便的方式得到更豐富的資訊等等。

下面簡單介紹2個例子,有用之人作為參考,大拿級別的,ignore吧。

例1. 新增完全自定義事件。

需求:假設客戶端(指新增了自定義控制項的窗體等等)想知道使用者是否在控制項上按下的shift鍵(當然,可以通過keypress之類的事件來判斷,沒必要再自己整個事件,例子只是個例子),控制項作者想通過乙個特殊的方式來進行判斷,這就可以選擇自定義事件。

好吧,起個名字,叫custom,需要客戶端在觸發custom時得到乙個布林屬性flag來判斷使用者是否按下shift。

按部就班:

(1)建立事件

// 建立事件

public

eventcustomeventhandler custom;

有問題,customeventhandler是什麼,當然,這裡需要乙個委託,於是還是搞定這個委託

(2)定義委託

// 定義委託

public

delegate

void

customeventhandler(objectsender, customeventargs e);

customeventhandler搞定了,又有新問題:customeventargs是啥,其實需要customeventargs來獲得你需要的資料,customeventhandler,於是還要定義個customeventargs(這個東西必須繼承自system.eventargs),在customeventargs裡面定義需要的資料屬性:flag

(3)定義eventargs

// 自定義eventargs,並新增自定義屬性【flag】

public

sealed

class

customeventargs:eventargs

private

booltestflag;

publiccustomeventargs(booltestflag)

this.testflag = testflag;

public

boolflag

get

有了customeventargs,以後在觸發事件之後便可以從e.flag中得到資料。

事件定義完了,這下看看效果先:

能看到在屬性視窗中已經能見到custom事件

可是custom到底是怎麼執行和在控制項內部觸發的呢,想破頭~

(4)執行事件的**

需要乙個oncustom來完成任務

// 執行事件

protected

virtual

voidoncustom(customeventargse)

if(custom !=null)

custom(this, e);

custom(this, e);

來完成調動客戶端的任務,現在問題的關鍵就在於在合適的地方執行一下oncustom就可以了,在何處執行,全看你需要的資料在什麼地方能後取得或者發生變化,本例簡單點,就在控制項本身的keydown事件裡面好了:

(5)何處執行oncustom

// 觸發事件處

private

voidmycontrol_keydown(objectsender,keyeventargse)

// 此處省略無關**。。。

// 客戶端按下shift鍵與否

booltestflag = e.shift;

customeventargseargs =new

customeventargs(testflag);

// 觸發事件

oncustom(eargs);

// 此處省略無關**。。。

至此算基本完成,看下最終效果:

在測試窗體上使用自定義控制項的custom事件

例2.對原有事件進行一定擴充套件,並覆蓋原事件

需求:想在keypress中再多獲得一些資料,起個名字:keyascii,但是keypress中沒有這個,那就自定義乙個customkeypress,不用keypress,並使其在客戶端隱藏

隱藏的辦法:

// 遮蔽keypress事件使其在客戶端不可見

[browsable(false)]

public

newevent

keypresseventhandlerkeypress;

以後跟例一差不多了,

建立事件,委託:

// 建立事件customkeypress替代keypress

public

event

customkeypresseventhandlercustomkeypress;

// 定義委託

public

delegate

void

customkeypresseventhandler(objectsender,customkeypresseventargse);

customkeypresseventargs要繼承自keypresseventargs,而system.windows.forms.keypresseventargs其實繼承自system.eventargs

// 自定義keypresseventargs,並新增自定義屬性【keyascii】

public

sealed

class

customkeypresseventargs:keypresseventargs

private

int32keyascii;

publiccustomkeypresseventargs(int32keyascii) :base((char)keyascii)

this.keyascii = keyascii;

public

int32keyascii

get

觸發事件處:

// 觸發事件處

protected

override

voidonkeypress(keypresseventargse)

if(customkeypress !=null)

customkeypresseventargseargs =new

customkeypresseventargs(e.keychar);

customkeypress(this, eargs);

base.onkeypress(e);

需要特別注意的是,keypress被隱藏之後,控制項本身的keypress事件也將不能被觸發

更新:關於隱藏事件,其實有別的辦法,

即新增乙個class,繼承controldesigner,重寫中的相關方法,然後在控制項上面attribute一下:[designerattribute(typeof(自己新增的class))]

注意,之前所謂的「在客戶端隱藏」,有點用詞不當,這其實是指在vs ide的屬性視窗中不可見,並不意味著無法在客戶端訪問,其實使用**還是可以的。

文章**:

為C 自定義控制項新增自定義事件

大氣象 原文 為c 自定義控制項新增自定義事件 這裡的自定義控制項是由普通控制項組合而成的。希望事件響應 推遲到使用自定義控制項的窗體裡寫。步驟一 新建乙個使用者控制項,放兩個按鈕,tag分別是btn1,btn2.這兩個按鈕的共用單擊事件處理 如下 using system using system...

為C 自定義控制項新增自定義事件

大氣象 原文 為c 自定義控制項新增自定義事件 這裡的自定義控制項是由普通控制項組合而成的。希望事件響應 推遲到使用自定義控制項的窗體裡寫。步驟一 新建乙個使用者控制項,放兩個按鈕,tag分別是btn1,btn2.這兩個按鈕的共用單擊事件處理 如下 using system using system...

為C 自定義控制項新增自定義事件

大氣象 原文 為c 自定義控制項新增自定義事件 這裡的自定義控制項是由普通控制項組合而成的。希望事件響應 推遲到使用自定義控制項的窗體裡寫。步驟一 新建乙個使用者控制項,放兩個按鈕,tag分別是btn1,btn2.這兩個按鈕的共用單擊事件處理 如下 using system using system...