1. 程式人生 > 其它 >【更正】“給自定義控制元件(Web Control)新增事件的幾種方法”有一個不太準確的地方。

【更正】“給自定義控制元件(Web Control)新增事件的幾種方法”有一個不太準確的地方。

    上一篇寫了一下如何在自定義控制元件裡面新增事件,由簡單的開始,一步一步實現了幾種新增事件的方式,由於當時只給自定義控制元件添加了一種外部事件,測試的時候沒有什麼問題,但是後來在寫分頁控制元件的時候,我給分頁控制元件加了兩種外部事件,然後測試的時候就出現了一個問題,本來只想呼叫外部的一種事件,結果外部的兩種事件都被呼叫了。分析了一下,

就是這個地方寫錯了,不能用 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