主頁 > 知識庫 > ASP.NET中實(shí)現(xiàn)定制自己的委托和事件參數(shù)類

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

熱門標(biāo)簽:百度AI接口 電銷業(yè)務(wù) 人工智能 電商新玩法 科大訊飛語音識別系統(tǒng) 客戶服務(wù) 國美全國運(yùn)營中心 網(wǎng)站排名優(yōu)化

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

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

OnTextChanged(EventArgs.Empty);

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

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

/// 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; }
  }
}

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

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

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

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

代碼中的這句:

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

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

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

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

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

這里繼續(xù)采用高效率事件集合列表對象base.Events,事件的名稱為PageIndexChanged,委托類型為之前我們定義的委托類型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ī)制時再詳細(xì)講解此方法。另外,在控件的翻頁欄中預(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;
}

代碼中首先定義一個頁參數(shù)類對象,然后通過條件語句判斷當(dāng)前是否是最后一頁,如果不是最后一頁,則從主控件上讀取當(dāng)前頁信息(當(dāng)前頁、頁數(shù)、頁記錄數(shù)),并賦值給GridPageChangedEventArgs對象,然后以頁參數(shù)對象作為參數(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對象中取出以Grid.EventPageIndexChanged為Key的事件引用句柄,假如句柄不為null(開發(fā)人員注冊了翻頁事件),則引發(fā)事件方法體。
最后,說明非常重要的一點(diǎn):如果自定義了事件參數(shù)類,并要求在開發(fā)人員注冊的事件體中自動顯示改變參數(shù)對象的類型,如:

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

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

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

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

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

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

您可能感興趣的文章:
  • Asp.Net 不同的OnClick事件區(qū)別小結(jié)(onserverclick,onclientclick)
  • ASP.NET的事件模型(很適合學(xué)習(xí)的文章)
  • Asp.net TextBox的TextChanged事件使用介紹
  • Asp.net 圖片文件防盜鏈(尊重勞動成果)及BeginRequest事件學(xué)習(xí)
  • ASP.NET 頁面事件執(zhí)行順序介紹
  • 詳解ASP.NET頁面生命周期事件
  • php 模擬 asp.net webFrom 按鈕提交事件的思路及代碼
  • asp.net錯誤處理Application_Error事件示例
  • asp.net錯誤捕獲(錯誤處理)page_error事件使用方法
  • ASP.NET頁面按鈕單擊事件失效的解決方法
  • asp.net頁面觸發(fā)事件panel滾動條高度不變的實(shí)現(xiàn)方法
  • asp.net在事件中啟動線程來打開一個頁面的實(shí)現(xiàn)方法
  • asp.net中c#自定義事件的實(shí)現(xiàn)方法詳解
  • ASP.NET中事件如何依次發(fā)生?

標(biāo)簽:POS機(jī) 棗莊 拉薩 南平 廈門 益陽 咸寧 攀枝花

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP.NET中實(shí)現(xiàn)定制自己的委托和事件參數(shù)類》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266