中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

ASP.NET中實(shí)現(xiàn)定制自己的委托和事件參數(shù)類(lèi)

本文實(shí)例講述了ASP.NET中實(shí)現(xiàn)定制自己的委托和事件參數(shù)類(lèi)的方法,對(duì)于學(xué)習(xí)ASP.NET有很好的參考借鑒價(jià)值。具體方法如下:

一般在實(shí)際開(kāi)發(fā)中,對(duì)于事件不需要傳遞數(shù)據(jù)信息時(shí),像上面的KingTextBox控件的事件,在引發(fā)事件時(shí)傳遞的參數(shù)為EventArgs.Empty,如下所示:

OnTextChanged(EventArgs.Empty);

這是因?yàn)榭丶﨣ingTextBox的TextChanged事件比較簡(jiǎn)單,這里不需要參數(shù)對(duì)象傳遞數(shù)據(jù)。但像一些復(fù)雜的控件比如GridView的按鈕命令事件,必須得有參數(shù)命令表示單擊了哪個(gè)按鈕;翻頁(yè)事件,需要EventArgs參數(shù)對(duì)象把當(dāng)前頁(yè)信息傳遞到頁(yè)面后臺(tái)代碼的事件體的第二個(gè)參數(shù)中,然后開(kāi)發(fā)人員根據(jù)此頁(yè)參數(shù)從數(shù)據(jù)庫(kù)取得對(duì)應(yīng)頁(yè)的數(shù)據(jù);還有像ItemDataBound事件,也需要把當(dāng)前Row信息和索引等數(shù)據(jù)作為EventArgs參數(shù)傳遞到事件實(shí)例中。

當(dāng)遇到以上這些情況,我們就需要定義自己的事件參數(shù)類(lèi)和委托,而不使用默認(rèn)的System.EventArgs類(lèi)。下面就以Grid控件的翻頁(yè)功能說(shuō)明一下定義事件參數(shù)類(lèi)和委托的方法,請(qǐng)看以下代碼:

/// <summary>/// /// </summary>public delegate void GridPageChangedEventHandler(object source, GridPage ChangedEventArgs e);public class GridPageChangedEventArgs : System.EventArgs{  public GridPageChangedEventArgs()  {  }  private int intCurrentPageIndex;  public new int CurrentPageIndex  {    get { return intCurrentPageIndex; }    set { intCurrentPageIndex = value; }  }  private int intPageCount;  public new int PageCount  {    get { return intPageCount; }    set { intPageCount = value; }  }  private int intPageSize;  public new int PageSize  {    get { return intPageSize; }    set { intPageSize = value; }  }}

以上代碼定義了一個(gè)存儲(chǔ)翻頁(yè)相關(guān)信息的參數(shù)類(lèi),此參數(shù)類(lèi)派生于System.EventArgs類(lèi),在這里系統(tǒng)不強(qiáng)制要求一定繼承于該類(lèi),不繼承它也是可以的,但繼承于該類(lèi)有一點(diǎn)好處。先看一下System.EventArgs基類(lèi)的代碼:

/// <summary>/// /// </summary>public class EventArgs{  //表示沒(méi)有事件數(shù)據(jù)的事件  public static readonly EventArgs Empty;  //初始化 System.EventArgs 類(lèi)的新實(shí)例  public EventArgs();}

EventArgs中除了一個(gè)構(gòu)造方法外,還有一個(gè)它本身類(lèi)型的Empty屬性,從這里可以知道前面在調(diào)用時(shí)通過(guò)OnTextChanged(EventArgs.Empty);格式,把EventArgs.Empty作為空參數(shù)傳入事件引發(fā)方法時(shí)的用途了。這里要說(shuō)明的是如果我們的GridPageChangedEventArgs類(lèi)是從EventArgs繼承而來(lái),則不但可以傳遞GridPageChangedEventArgs類(lèi)對(duì)象,而且可以使用GridPageChangedEventArgs.Empty的形式傳遞空參數(shù)對(duì)象。

在GridPageChangedEventArgs方法體中定義了一些屬性;分別表示當(dāng)前頁(yè)(CurrentPageIndex)、頁(yè)總數(shù)(PageCount)和頁(yè)尺寸(PageSize)。這些都是我們自定義的頁(yè)信息數(shù)據(jù)。

代碼中的這句:

public delegate void GridPageChangedEventHandler(object source, GridPage ChangedEventArgs e);

定義了一個(gè)委托GridPageChangedEventHandler。該委托可以指定這樣的一個(gè)事件方法:第一個(gè)參數(shù)為object類(lèi)型,第二個(gè)參數(shù)即為上面我們定義的頁(yè)參數(shù)類(lèi)對(duì)象GridPageChanged EventArgs。在注冊(cè)事件時(shí),該委托可以保證在頁(yè)面后面代碼中自動(dòng)產(chǎn)生的事件體的兩個(gè)參數(shù)類(lèi)型與自己的兩個(gè)參數(shù)類(lèi)型一致。下面是在頁(yè)面中注冊(cè)的事件后臺(tái)代碼:

protected void Grid1_PageIndexChanged(object source,GridPageChangedEventArgs e){  int intCurrentPageIndex = e.CurrentPageIndex;  int intPageSize = e.PageSize;  //獲取數(shù)據(jù)邏輯}

可以看到第二個(gè)參數(shù)類(lèi)型即我們定義的GridDocPageChangedEventArgs類(lèi)型,在事件方法體中,可以直接通過(guò)e.CurrentPageIndex和e.PageSize獲取數(shù)據(jù),這種應(yīng)用就比較多了。
現(xiàn)在頁(yè)參數(shù)對(duì)象和委托定義好了,下面說(shuō)一下在主控件內(nèi)部是如何應(yīng)用它們的。聲明事件代碼如下:

/// <summary>/// /// </summary>private new static readonly object EventPageIndexChanged = new object();[Category("Action"), Description("翻頁(yè)事件")]public event GridPageChangedEventHandler PageIndexChanged{  add  {    base.Events.AddHandler(Grid.EventPageIndexChanged, value);  }  remove  {    base.Events.RemoveHandler(Grid.EventPageIndexChanged, value);  }}

這里繼續(xù)采用高效率事件集合列表對(duì)象base.Events,事件的名稱(chēng)為PageIndexChanged,委托類(lèi)型為之前我們定義的委托類(lèi)型GridPageChangedEventHandler。
引發(fā)事件的核心代碼如下:

/// <summary>/// /// </summary>protected override bool OnBubbleEvent(object source, EventArgs e){  bool handled = false;  if (e is GridCommandEventArgs)  {    if ((((GridCommandEventArgs)(e)).CommandSource) is LinkButton)    {      LinkButton lb=((LinkButton)(((GridCommandEventArgs)(e)). Command Source));      if (lb.CommandName == "Page")      {        if (lb.CommandArgument == "ButtonFirst")        {          GridPageChangedEventArgs ee = new GridPageChangedEventArgs();          if (this.CurrentPageIndex != 0)          {            this.CurrentPageIndex = 0;            ee.CurrentPageIndex = this.CurrentPageIndex;            ee.PageCount = this.PageCount;            ee.PageSize = this.PageSize;            this.OnPageIndexChanged(ee);          }          handled = true;        }        if (lb.CommandArgument == "ButtonNext")        {          GridPageChangedEventArgs ee = new GridPageChangedEventArgs();          if (this.CurrentPageIndex < this.PageCount - 1)          {            this.CurrentPageIndex += 1;            ee.CurrentPageIndex = this.CurrentPageIndex;            ee.PageCount = this.PageCount;            ee.PageSize = this.PageSize;            this.OnPageIndexChanged(ee);          }          handled = true;        }        if (lb.CommandArgument == "ButtonPrev")        {          GridPageChangedEventArgs ee = new GridPageChangedEventArgs();          if (this.CurrentPageIndex > 0)          {            this.CurrentPageIndex -= 1;            ee.CurrentPageIndex = this.CurrentPageIndex;            ee.PageCount = this.PageCount;            ee.PageSize = this.PageSize;            this.OnPageIndexChanged(ee);          }          handled = true;        }        if (lb.CommandArgument == "ButtonLast")        {          GridPageChangedEventArgs ee = new GridPageChangedEventArgs();          if (this.CurrentPageIndex != this.PageCount - 1)          {            this.CurrentPageIndex = this.PageCount - 1;            ee.CurrentPageIndex = this.CurrentPageIndex;            ee.PageCount = this.PageCount;            ee.PageSize = this.PageSize;            this.OnPageIndexChanged(ee);          }          handled = true;        }      }    }  }  return handled || base.OnBubbleEvent(source, e);}

以上OnBubbleEvent方法主要應(yīng)用于復(fù)合控件中,采用冒泡形式處理子控件事件,后面介紹復(fù)合控件冒泡處理事件機(jī)制時(shí)再詳細(xì)講解此方法。另外,在控件的翻頁(yè)欄中預(yù)先放置了四個(gè)翻頁(yè)功能的按鈕,分別表示“首頁(yè)”、“”、“”、“末頁(yè)”,并設(shè)置它們的屬性CommandName都為“Page”,CommandArgument分別為“ButtonFirst”,“ButtonPrev”,“ButtonNext”,“ButtonLast”。
這樣就可以根據(jù)按鈕的命令和參數(shù)確定執(zhí)行什么樣的邏輯。這里僅拿按鈕“”(Command="Page"&&CommandArgument="ButtonNext")為例解釋一下代碼邏輯:

/// <summary>////// </summary>if (lb.CommandArgument == "ButtonNext"){    GridPageChangedEventArgs ee = new GridPageChangedEventArgs();    if (this.CurrentPageIndex < this.PageCount - 1)    {      this.CurrentPageIndex += 1;      ee.CurrentPageIndex = this.CurrentPageIndex;      ee.PageCount = this.PageCount;      ee.PageSize = this.PageSize;      this.OnPageIndexChanged(ee);    }    handled = true;}

代碼中首先定義一個(gè)頁(yè)參數(shù)類(lèi)對(duì)象,然后通過(guò)條件語(yǔ)句判斷當(dāng)前是否是最后一頁(yè),如果不是最后一頁(yè),則從主控件上讀取當(dāng)前頁(yè)信息(當(dāng)前頁(yè)、頁(yè)數(shù)、頁(yè)記錄數(shù)),并賦值給GridPageChangedEventArgs對(duì)象,然后以頁(yè)參數(shù)對(duì)象作為參數(shù)調(diào)用this.OnPageIndexChanged方法引發(fā)事件。另外,注意LinkButton的CommandName和CommandArgument屬性的組合用法。
最后,看一下OnPageIndexChanged方法代碼:

/// <summary>/// </summary>protected new void OnPageIndexChanged(GridPageChangedEventArgs e){  GridPageChangedEventHandler handler1 = (GridPageChangedEventHandler)base. Events[Grid.EventPageIndexChanged];  if (handler1 != null)  {    handler1(this, e);  }}

此方法的功能是從base.Events對(duì)象中取出以Grid.EventPageIndexChanged為Key的事件引用句柄,假如句柄不為null(開(kāi)發(fā)人員注冊(cè)了翻頁(yè)事件),則引發(fā)事件方法體。
最后,說(shuō)明非常重要的一點(diǎn):如果自定義了事件參數(shù)類(lèi),并要求在開(kāi)發(fā)人員注冊(cè)的事件體中自動(dòng)顯示改變參數(shù)對(duì)象的類(lèi)型,如:

protected void Grid1_PageIndexChanged(object source, GridPageChangedEventArgs e){  //… … }

其中的第二個(gè)參數(shù)顯示為GridPageChangedEventArgs類(lèi)型,而不是默認(rèn)的EventArgs類(lèi)型,我們也必須定義自己的委托(如本例定義了委托GridPageChangedEventHandler);而默認(rèn)的委托EventHandler對(duì)應(yīng)的參數(shù)類(lèi)型為基類(lèi)System.EventArgs,即如果這里將默認(rèn)的委托EventHandler和GridPageChangedEventArgs類(lèi)一起使用的話(huà),則生成以下的代碼語(yǔ)句:

protected void Grid1_PageIndexChanged(object source, EventArgs e){  //… … }

可以看出參數(shù)變?yōu)镋ventArgs類(lèi)型了。這樣就不能利用我們自己定義的GridPage ChangedEventArgs類(lèi)中的數(shù)據(jù)了。雖然可以使用(GridPageChangedEventArgs)EventArgs的方式轉(zhuǎn)換一下也可以取得GridPageChangedEventArgs對(duì)象中的數(shù)據(jù),但據(jù)筆者了解還沒(méi)有開(kāi)發(fā)人員這么用,因?yàn)闆](méi)有人知道還有個(gè)GridPageChangedEventArgs類(lèi)。

本文主要講解如何定制自己的參數(shù)類(lèi)和委托,并以Grid的分頁(yè)功能為例演示其在實(shí)際開(kāi)發(fā)中的應(yīng)用

感興趣的讀者可以參考本文所述調(diào)試運(yùn)行本文示例,相信會(huì)有新的收獲。

AspNet技術(shù)ASP.NET中實(shí)現(xiàn)定制自己的委托和事件參數(shù)類(lèi),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产精品国产三级国产aⅴ中文 | 91视频国产精品 | 二区三区视频 | 国产欧美精品区一区二区三区 | 国产1区2区3区 | 男女网站免费观看 | 免费午夜视频 | 天天爽天天干 | 91精品久久久久久久久中文字幕 | 欧美黄在线观看 | 精品一区二区在线视频 | www.日日操 | 四虎影视一区二区 | 午夜在线视频一区二区三区 | 天天色综| 综合激情av| 国产精品99久久免费观看 | 久久久久久国产精品久久 | 亚洲成人免费av | 日干夜操 | 四虎最新 | 中文字幕 国产精品 | 国产亚洲成av人片在线观看桃 | 精品国产乱码久久久久久闺蜜 | 欧美午夜精品久久久久久浪潮 | 国产精品视频综合 | 日韩精品一区二区三区老鸭窝 | 亚洲精品一二三 | 国产高清一区二区三区 | 久久国产精品视频 | 一区二区免费 | 91国产在线播放 | 奇米四色在线观看 | 亚洲国产精品99久久久久久久久 | 亚洲 中文 欧美 日韩 在线观看 | 欧美日韩亚洲二区 | 日本一区视频在线观看 | 国产日韩欧美在线观看 | 欧美色综合 | 日韩中文一区二区三区 | 国产黄色小视频 |