1. 程式人生 > >C# 呼叫一個按鈕的Click事件

C# 呼叫一個按鈕的Click事件

最基本的呼叫方法

(1)button1.PerformClick();
(2)button1_Click(null,null);
(3)button_Click(null,new EventArgs());

利用反射呼叫

最開始的呼叫方法

複製程式碼
//建立一個函式  
private void callOnClick(Button btn)  
{  
    //建立一個型別  
    Type t = typeof(Button);  
    //引數物件  
    object[] p = new object[1];  
    //產生方法  
    MethodInfo m = t.GetMethod("
OnClick", BindingFlags.NonPublic | BindingFlags.Instance); //引數賦值。傳入函式 p[0] = EventArgs.Empty; //呼叫 m.Invoke(btn, p); return; } //呼叫例子。 //呼叫Button1的onclick callOnClick(Button1); //呼叫Button5的onclick callOnClick(Button5);
複製程式碼

擴充套件一下,可以呼叫更多的事件。

複製程式碼
private void callButtonEvent(Button btn, string
EventName) { //建立一個型別 Type t = typeof(Button); //引數物件 object[] p = new object[1]; //產生方法 MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance); //引數賦值。傳入函式 //獲得引數資料 ParameterInfo[] para = m.GetParameters();
//根據引數的名字,拿引數的空值。 p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty"); //呼叫 m.Invoke(btn, p); return; } //呼叫例子。 //呼叫Button1的onclick callButtonEvent(Button1,"OnClick"); //呼叫Button5的OnKeyPress callButtonEvent(Button5,"OnKeyPress");
複製程式碼

現在,再來一次擴充套件。可以處理Button,TextBox等等的一些事件。

複製程式碼
private void callObjectEvent(Object obj, string EventName)  
{     
     //建立一個型別,AssemblyQualifiedName拿出有效的名字     
     Type t = Type.GetType(obj.GetType().AssemblyQualifiedName);  
     //引數物件      
     object[] p = new object[1];  
     //產生方法      
     MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);  
     //引數賦值。傳入函式      
     //獲得引數資料  
     ParameterInfo[] para =  m.GetParameters();  
     //根據引數的名字,拿引數的空值。  
     p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");  
     //呼叫      
     m.Invoke(obj, p);  
     return;  
}  
  
//呼叫例子。  
//呼叫Button1的onclick  
callObjectEvent(Button1,"OnClick");  
  
//呼叫Button5的OnKeyPress  
callObjectEvent(Button5,"OnKeyPress");  
  
//呼叫Text1的OnTextChanged  
callObjectEvent(Text1, "OnTextChanged");  
複製程式碼

繼續來多一個擴充套件。可以傳入事件引數。

複製程式碼
private void callObjectEvent(Object obj, string EventName, EventArgs e=null)  
{     
    //建立一個型別      
    //Type t = typeof(obj.GetType);  
    Type t = Type.GetType(obj.GetType().AssemblyQualifiedName);  
    //產生方法      
    MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);  
    //引數賦值。傳入函式      
    //獲得引數資料  
    ParameterInfo[] para =  m.GetParameters();  
    //根據引數的名字,拿引數的空值。  
    //引數物件      
    object[] p = new object[1];  
    if (e == null)  
        p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");  
    else  
        p[0] = e;  
    //呼叫  
    m.Invoke(obj, p);  
    return;  
}  
  
//呼叫例子。  
//呼叫Button1的onclick  
callObjectEvent(Button1,"OnClick");  
//呼叫Button5的OnKeyPress  
callObjectEvent(Button5,"OnKeyPress");  
//呼叫Text1的OnTextChanged  
callObjectEvent(Text1, "OnTextChanged");  
//呼叫Form的KeyPress事件, this就是那個winform, 並且傳入回車鍵  
callObjectEvent(this, "OnKeyPress", new KeyPressEventArgs((char)13));  
複製程式碼

測試的時候,是在winform裡的控制元件的呼叫。在程式裡要加入

using System.Reflection;