日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

大白话系列之C#委托与事件讲解大结局

發(fā)布時(shí)間:2025/3/21 C# 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大白话系列之C#委托与事件讲解大结局 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天是大白話系列之C#委托與事件講解的大結(jié)局,也是我們最關(guān)心的,在日常的MES系統(tǒng)編程中到底怎樣使用這樣的利器,其實(shí)我們每天都在使用事件,一個(gè)窗體,一個(gè)按鈕都包含這事件,只是很少用到自己寫(xiě)的委托和事件,說(shuō)白了不知道如何下手,也不知道在什么樣的場(chǎng)景下應(yīng)用。

用到事件的地方有很多,這次講解就MES系統(tǒng)開(kāi)發(fā)中我們經(jīng)常應(yīng)用的場(chǎng)景。
一、通用控件場(chǎng)景
通用控件有很多,這里舉最常用的萬(wàn)能通用分頁(yè)控件
【注:】本分頁(yè)控件,只是為了講解使用,并非真分頁(yè)控件,還是基于.net控件的分頁(yè)
我們先來(lái)看場(chǎng)景

我們所看到的這個(gè)分頁(yè)控件就是這次講解的主角,在日常的編程中,像這樣功能我們用的做多,所以我們必須要把它抽象出來(lái),不能每個(gè)頁(yè)面都寫(xiě)分頁(yè)邏輯吧。那我們想想到底怎樣去實(shí)現(xiàn)這樣的功能呢?怎樣才能讓頁(yè)面知道我們按了控件的哪個(gè)按鈕呢?這時(shí)候讓我們聯(lián)想一想委托與事件,一定要聚精會(huì)神,叮咚!有了,我們可以把這個(gè)控件想象成一個(gè)發(fā)布者,而各個(gè)頁(yè)面就想象成訂閱者,或者是觀察者,當(dāng)頁(yè)面訂閱了分頁(yè)控件的事件后,自然就會(huì)相應(yīng)了嘛?

有了思路,我們就開(kāi)始行動(dòng)吧!

第一步,我們編寫(xiě)發(fā)布者代碼,也就是這個(gè)控件代碼

?

代碼

???//和我們上一講講的一樣,我們先定義訂閱者所感興趣的對(duì)象,這里我們將它抽象成Action,也就是首頁(yè)、下頁(yè)、上頁(yè)之類(lèi)的動(dòng)作
????public?class?PageChangeEventArgs?:?EventArgs
????{
????????private?string?action?=?string.Empty;
????????public?string?Action
????????{
????????????get
????????????{
????????????????return?this.action;
????????????}
????????????set
????????????{
????????????????this.action?=?value;
????????????}
????????}

????????public?PageChangeEventArgs()
????????{

????????}????????

????????public?PageChangeEventArgs(String?paramAction)
????????{
????????????this.Action?=?paramAction;
????????}
????}

????//發(fā)布者代碼?也就是控件代碼
????public?partial?class?UIPageControlsNavigator?:?System.Web.UI.UserControl
????{
????????//這里我們聲明一個(gè)頁(yè)面改變的委托[注:命名一定要規(guī)范]
????????public?delegate?void?PageChangeEventHandler(object?sender,?PageChangeEventArgs?e);
????????//這里我們聲明一個(gè)事件
?????????public?event?PageChangeEventHandler?PageChange;
????????//然后以個(gè)保護(hù)類(lèi)型的OnPageChange方法
?????????protected?virtual?void?OnPageChange(PageChangeEventArgs?e)
????????{
????????????if?(PageChange?!=?null)
????????????{
????????????????PageChange(this,?e);
????????????}
????????}

????????//這里就是上一講中,具體的觸發(fā)函數(shù),這里變成了一個(gè)按鈕觸發(fā)事件
?????????protected?void?lbtnFirst_Click(object?sender,?EventArgs?e)
????????{
????????????//這時(shí)候,訂閱者關(guān)心的對(duì)象e,也就是觸發(fā)的是“首頁(yè)”這個(gè)按鈕
????????????OnPageChange(new?PageChangeEventArgs("First"));
????????}

????????protected?void?lbtnPrevious_Click(object?sender,?EventArgs?e)
????????{
????????????//這時(shí)候,訂閱者關(guān)心的對(duì)象e,也就是觸發(fā)的是“下頁(yè)”這個(gè)按鈕
????????????OnPageChange(new?PageChangeEventArgs("Previous"));
????????}

????????protected?void?lbtnLast_Click(object?sender,?EventArgs?e)
????????{
????????????OnPageChange(new?PageChangeEventArgs("Last"));
????????}

????????protected?void?lbtnNext_Click(object?sender,?EventArgs?e)
????????{
????????????OnPageChange(new?PageChangeEventArgs("Next"));
????????}

????????protected?void?btnSearch_Click(object?sender,?EventArgs?e)
????????{
????????????if?(IsNumber(txtSearchPageCount.Text))
????????????{
????????????????OnPageChange(new?PageChangeEventArgs("Search"));
????????????}
????????}

????????protected?void?cmbPerPage_SelectedIndexChanged(object?sender,?EventArgs?e)
????????{
????????????OnPageChange(new?PageChangeEventArgs("PageSizeChanged"));
????????}?
????????
????????....

????????#region?public?void?BindData(GridView?myGridView,?IList?businessObjects,?PageChangeEventArgs?e)
????????///?<summary>
????????///?具體控件分頁(yè)功能實(shí)現(xiàn)
?????????///?</summary>
????????///?<param?name="myGridView">當(dāng)前Grid控件</param>
????????///?<param?name="businessObjects">數(shù)據(jù)源</param>
????????///?<param?name="e">事件對(duì)象</param>
????????public?void?BindData(GridView?myGridView,?IList?businessObjects,?PageChangeEventArgs?e)
????????{
????????????//?計(jì)算頁(yè)面數(shù)
????????????if?(businessObjects?==?null)
????????????{
????????????????this.RowCount?=?0;

????????????}
????????????else
????????????{
????????????????this.RowCount?=?businessObjects.Count;
????????????}

????????????double?pageCount?=?(double)RowCount?/?this.PageSize;
????????????this.PageCount?=?(int)Math.Ceiling(pageCount);
????????????myGridView.DataSource?=?businessObjects;
????????????myGridView.PageSize?=?this.PageSize;
????????????switch?(e.Action)
????????????{
????????????????case?"PageLoad":
????????????????????if?(CurrentPage?>?0)
????????????????????{
????????????????????????myGridView.PageIndex?=?CurrentPage?-?1;
????????????????????}?
????????????????????break;
????????????????case?"First":
????????????????????myGridView.PageIndex?=?0;
????????????????????myGridView.EditIndex?=?-1;
????????????????????break;
????????????????case?"Previous":
????????????????????myGridView.PageIndex--;
????????????????????myGridView.EditIndex?=?-1;
????????????????????break;
????????????????case?"Next":
????????????????????myGridView.PageIndex++;
????????????????????myGridView.EditIndex?=?-1;
????????????????????break;
????????????????case?"Last":
????????????????????myGridView.PageIndex?=?this.PageCount?-?1;
????????????????????myGridView.EditIndex?=?-1;
????????????????????break;
????????????????case?"PageSizeChanged":
????????????????????myGridView.PageIndex?=?0;
????????????????????myGridView.EditIndex?=?-1;
????????????????????break;
????????????????case?"Search":
????????????????????myGridView.PageIndex?=?int.Parse(txtSearchPageCount.Text)?-?1;
????????????????????break;
????????????????case?"Refresh":
????????????????????break;
????????????????default:
????????????????????myGridView.PageIndex?=?0;
????????????????????break;
????????????}
????????????//?頁(yè)數(shù)不夠了,進(jìn)行調(diào)整
????????????if?(myGridView.PageIndex?>=?this.PageCount)
????????????{
????????????????myGridView.PageIndex?=?this.PageCount?==?0???0?:?this.PageCount?-?1;
????????????}
????????????myGridView.DataBind();
????????????//?獲取按鈕的狀態(tài)
????????????this.GetButtonState(myGridView);
????????}
????????#endregion???
????}

?

?

?當(dāng)然控件代碼還不值這些,我這里就列舉出我們委托事件需要的代碼:

然后我們看一下調(diào)用頁(yè)面的代碼,也就是觀察者,本例中是角色頁(yè)面RoleManage.aspx

代碼

????//角色管理頁(yè)面代碼類(lèi)
????public?partial?class?RoleManage?:?BasePage
????{
????????protected?void?Page_Load(object?sender,?EventArgs?e)
????????{
????????????//在當(dāng)前頁(yè)面訂閱控件的點(diǎn)擊事件
????????????this.myNavigator.PageChange?+=?new?PageChangeEventHandler(this.myNavigator_PageChange);
????????????if?(!Page.IsPostBack)
????????????{

????????????}
????????}
????????
????????//具體的點(diǎn)擊觸發(fā)函數(shù)功能,這里就是控件的分頁(yè)
????????private?void?myNavigator_PageChange(object?sender,?PageChangeEventArgs?e)
????????{
????????????this.GetAllRoles(e);
????????}

????????private?void?GetAllRoles(PageChangeEventArgs?e)
????????{
????????????try
????????????{
????????????????//角色數(shù)據(jù)源
????????????????roles?=?roleService.GetAllRoles();
????????????????//調(diào)用控件的分頁(yè)功能函數(shù),這個(gè)封裝在分頁(yè)控件里可以,封裝在通用的類(lèi)庫(kù)里也行
????????????????this.myNavigator.BindData(this.grdRole,?roles,?e);
????????????????
????????????}
????????????catch?(Exception?myException)
????????????{
????????????????return;
????????????}
????????}
}

?其實(shí)原理很簡(jiǎn)單,當(dāng)控件上按下下頁(yè)或者其它按鈕的時(shí)候,這時(shí)候因?yàn)榻巧芾眄?yè)面已經(jīng)訂閱了這個(gè)事件,所以它會(huì)執(zhí)行具體委托的那個(gè)實(shí)體函數(shù),就這么簡(jiǎn)單

大家了看了可能會(huì)頭大,那就自己動(dòng)手試著做一下,只有做了才能真正的體會(huì)到里面的奧妙,其實(shí)和我上一講內(nèi)容很相識(shí),只是稍微有一點(diǎn)點(diǎn)的變化而已。

?

先休息一下:

名人名言:

?職業(yè)生涯:
我總覺(jué)得,職業(yè)生涯首先要關(guān)注的是自己,自己想要什么?大多數(shù)人大概沒(méi)想過(guò)這個(gè)問(wèn)題,唯一的想法只是——我想要一份工作,我想要一份不錯(cuò)的薪水,我知道所有人對(duì)于薪水的渴望,可是,你想每隔幾年重來(lái)一次找工作的過(guò)程么?你想每年都在這種對(duì)于工作和薪水的焦急不安中度過(guò)么?不想的話,就好好想清楚。飲鴆止渴,不能因?yàn)榭诳示推疵榷舅帯T绞墙辜?#xff0c;越是覺(jué)得自己需要一份工作,越饑不擇食,越想不清楚,越容易失敗,你的經(jīng)歷越來(lái)越差,下一份工作的人看著你的簡(jiǎn)歷就皺眉頭。于是你越喝越渴,越渴越喝,陷入惡性循環(huán)。最終只能哀嘆世事不公或者生不逢時(shí),只能到天涯上來(lái)發(fā)泄一把,在失敗者的共鳴當(dāng)中尋求一點(diǎn)心理平衡罷了。大多數(shù)人都有生存壓力,我也是,有生存壓力就會(huì)有很多焦慮,積極的人會(huì)從焦慮中得到動(dòng)力,而消極的人則會(huì)因?yàn)榻箲]而迷失方向。所有人都必須在壓力下做出選擇,這就是世道,你喜歡也罷不喜歡也罷。

?

二、業(yè)務(wù)控件場(chǎng)景

大家在做MES系統(tǒng)的時(shí)候,50%的時(shí)候是在復(fù)制黏貼,甚至有的時(shí)候有些邏輯老是復(fù)制到這里,然后復(fù)制到那里,當(dāng)然起初的時(shí)候感覺(jué)很快,也不用動(dòng)腦子ctrl+c,ctrl+v結(jié)束,但是到后來(lái)邏輯改了,那時(shí)候就像沒(méi)頭蒼蠅似的,早就忘了到底有多少地方用到這些邏輯,所以往往到BUG發(fā)生的時(shí)候,才恍然大悟“哦!原來(lái)這里忘了改了!”等等。我并不反對(duì)大家ctrl+c,ctrl+v,但是在享受這樣的快捷之后,騰出時(shí)間再來(lái)重構(gòu)一下,看看這時(shí)候能否用是否能抽象呀?用設(shè)計(jì)模式?符不符合00的設(shè)計(jì)原則?不然你就是編10年的軟件,又能得到什么樣的提高!又扯遠(yuǎn)了。。。

?

接下來(lái),我們具體來(lái)看場(chǎng)景:

?

?這是一個(gè)工作流審批用戶控件,做MES系統(tǒng)的其實(shí)經(jīng)常會(huì)和這個(gè)打交道,然而我們把這個(gè)邏輯封裝成一個(gè)控件,那我們?cè)诮窈缶S護(hù)上將會(huì)減輕很多工作量

這里我只介紹這控件技術(shù)上我們用到的委托和事件的代碼

?

代碼

public?partial?class?ApprovalResults?:?System.Web.UI.UserControl
{
??//EventHandler是微軟默認(rèn)的委托,在本例中我們直接就用EventHandler來(lái)表示委托,當(dāng)然它的參數(shù)是Sender,e
??public?event?EventHandler?Preview;
??public?event?EventHandler?Submit;
??public?event?EventHandler?FMOK;
??public?event?EventHandler?FMProgress;
??public?event?EventHandler?FMSave;

??...
??//提交按鈕事件
??protected?void?btnSubmit_Click(object?sender,?EventArgs?e)
??{
????try
?????{
??????//觸發(fā)我們定義的事件
??????Submit(sender,?e);
?????}
?????catch?(Exception?ex)
?????{
?????...
?????}
??}

??...
}

?

然后我們到訂閱這個(gè)事件的頁(yè)面上看一下代碼

?

代碼

????public?partial?class?Preview?:?BasePage
????{
????????protected?void?Page_Load(object?sender,?EventArgs?e)
????????{
????????????...
????????????//在次頁(yè)面中訂閱審批控件的提交按鈕事件
????????????ApprovalResults1.Submit?+=?new?EventHandler(ApprovalResults1_Submit);
????????}
????????
????????//具體的提交事件功能函數(shù)
????????public?void?ApprovalResults1_Submit(object?sender,?EventArgs?e)
????????{????????????
????????????try
????????????{????????????????
????????????}
????????????catch?(Exception?ex)
????????????{???????????????
????????????}
????????????finally
????????????{?????????????
????????????}
????????}
????}

?

?

這樣我想大家都理解了,當(dāng)審批控件點(diǎn)擊提交按鈕,其實(shí)訪問(wèn)的就是訂閱者頁(yè)面的功能函數(shù)。

其實(shí)委托事件應(yīng)用的場(chǎng)景還有很多,它就是觀察者模式的提煉。

到此委托與事件講解的大白話系列到此完畢,我非常希望大家能看了我的文章后能有點(diǎn)收獲。

?

from:?https://www.cnblogs.com/wudiwushen/archive/2010/04/23/1717829.html

總結(jié)

以上是生活随笔為你收集整理的大白话系列之C#委托与事件讲解大结局的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。