【更正】“給自定義控制元件(Web Control)新增事件的幾種方法”有一個不太準確的地方。
阿新 • • 發佈:2022-04-29
上一篇寫了一下如何在自定義控制元件裡面新增事件,由簡單的開始,一步一步實現了幾種新增事件的方式,由於當時只給自定義控制元件添加了一種外部事件,測試的時候沒有什麼問題,但是後來在寫分頁控制元件的時候,我給分頁控制元件加了兩種外部事件,然後測試的時候就出現了一個問題,本來只想呼叫外部的一種事件,結果外部的兩種事件都被呼叫了。分析了一下,
就是這個地方寫錯了,不能用 this,要單獨定義一個 object才行。
由於上一篇只是一個簡單的 demo,我又比較懶,就不去修改了,這裡直接把分頁控制元件的事件部分的程式碼寫出來,供大家參考。
[Serializable] public class PageArgs : EventArgs { /**//// <summary> /// 翻頁前的頁號,不知道這個有沒有用 /// </summary> public Int32 OldPageIndex; /**//// <summary> /// 像要翻到的頁號 /// </summary> public Int32 CurrentPageIndex; }
定義委託#region 定義委託 /**//// <summary> /// 定一個委託,翻頁的事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public delegate void EventPageChange(Object sender, PageArgs e); /**//// <summary> /// 事件用 /// </summary> protected static readonly object EventChange = new object(); /**//// <summary> /// 事件用 /// </summary> protected static readonly object EventBind = new object(); #endregion 定義事件#region 定義事件 /**//// <summary> /// 使用者單擊頁號後,觸發的事件,在繫結顯示資料的控制元件之前觸發 /// </summary> [Description("頁號改變的時候觸發")] public event EventPageChange PageChanged { add { Events.AddHandler(EventChange, value); } remove { Events.RemoveHandler(EventChange, value); } } /**//// <summary> /// 使用者單擊頁號後,並且繫結顯示資料的控制元件之後觸發 /// </summary> [Description("在自動提取資料的方式下,繫結控制元件後觸發")] public event EventPageChange GridBinded { add { Events.AddHandler(EventBind, value); } remove { Events.RemoveHandler(EventBind, value); } } #endregion 呼叫外部事件#region 呼叫外部事件 /**//// <summary> /// 使用者單擊頁號後,觸發的事件,在繫結顯示資料的控制元件之前觸發 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void OnPageChange(object sender, PageArgs e) { EventPageChange hd = (EventPageChange)base.Events[EventChange]; if (hd != null) hd(sender, e); } /**//// <summary> /// 繫結控制元件後觸發 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void OnGridBinded(object sender, PageArgs e) { EventPageChange hd = (EventPageChange)base.Events[EventBind]; if (hd != null) hd(sender, e); } #endregion 分頁控制元件的回發事件#region 分頁控制元件的回發事件 /**//// <summary> /// 分頁控制元件的回發事件 /// </summary> /// <param name="PageIndex">要翻到的頁號</param> public void RaisePostBackEvent(string PageIndex) { Int32 tmpPageIndex = 1; //不是數字,顯示第一頁 if (Functions.IsInt(PageIndex)) tmpPageIndex = Int32.Parse(PageIndex); Pager_Click(tmpPageIndex); } #endregion 響應分頁事件#region 響應分頁事件 /**//// <summary> /// 響應分頁事件 /// </summary> private void Pager_Click(Int32 tmpPageIndex) { //判斷頁號是否超出有效範圍 if (tmpPageIndex < 0) tmpPageIndex = 1; if (tmpPageIndex > this.PageCount) tmpPageIndex = this.PageCount; //定義一個事件裡的引數 PageArgs e = new PageArgs(); e.OldPageIndex = this.PageIndex; e.CurrentPageIndex = tmpPageIndex; this.PageIndex = tmpPageIndex; //觸發(呼叫)外部的事件 this.OnPageChange(this, e); if (this.SetGetDataKind == myPageGetDataKind.Auto) { //自動提取資料的方式 //繫結控制元件 DataBind(tmpPageIndex); //觸發(呼叫)外部的事件 this.OnGridBinded(this, e); } //顯示UI this.ManagerPageUI.AddPageUI(); } #endregion