2011年9月3日 星期六

[ASP.NET]使用反射機制驅動事件

問題:在ASP.NET的Callback發生時,可以同時處理Postback機制的事件,但是Postback的頁面會刷掉Callback的結果,造成畫面閃動的現象。

但是我還是想要由Ccallback執行Poastback的事件。

目標:可以應用在ASP.NET的Web From上,由一個控制項來驅動另一個控制項的事件。注意,在同一個類別中不適用(用一般的方法就好啦)。

方法:1. 註冊一個事件,可以使用

        protected void Button1_Click(object sender, EventArgs e)
        {            
        }

(.aspx 的 AutoEventWireup="true")



或是

        protected void Page_Load(object sender, EventArgs e)
        {
            Button1.Click +=new EventHandler(Button1_Click);
        }


2. 找到畫面上的目標控制項,就是要驅動事件的控制項。例如要驅動Button的Click事件


Button btn = this.Page.FindControl("button1") as Button;


3. 使用反射方法找到Click事件的委託(Delegate),再執行這個事件。

RaiseEvent(btn, "Click", new EventArgs());
private void RaiseEvent(object sender, string eventName, EventArgs args)
{
    PropertyInfo property = sender.GetType().GetProperty("Events",
                                             BindingFlags.Instance |
                                             BindingFlags.NonPublic);
    EventHandlerList ehList = (EventHandlerList)property.GetValue(sender, null);
    FieldInfo fieldInfo = sender.GetType().GetField("Event" + eventName,
                                                  BindingFlags.Static |
                                                  BindingFlags.NonPublic);
    Delegate d = ehList[fieldInfo.GetValue(null)];
    object[] objects = new object[] { sender, new EventArgs() };
    d.DynamicInvoke(objects);
}

 


參考文件:


沒有留言:

張貼留言