C# 调用一个窗口的click事件(利用反射)

引用自 :http://blog.csdn.net/dogfish/article/details/7048280

 

最基本的调用方法

(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;  
C#中,可以使用委托来实现一个窗口调用一个窗口并赋值的功能。以下是一个示例代码,演示了如何在一个窗口调用一个窗口,并使用委托将值传递给目标窗口: 在目标窗口中定义一个委托和一个事件,用于接收传递的值: ```csharp public delegate void ValuePassedDelegate(string value); public event ValuePassedDelegate ValuePassed; ``` 在调用窗口中,创建目标窗口的实例,并订阅目标窗口事件: ```csharp private void OpenTargetWindowButton_Click(object sender, EventArgs e) { TargetWindow targetWindow = new TargetWindow(); targetWindow.ValuePassed += TargetWindow_ValuePassed; targetWindow.Show(); } ``` 在调用窗口中定义事件处理方法,该方法将接收到的值传递给目标窗口的委托: ```csharp private void TargetWindow_ValuePassed(string value) { // 在这里处理接收到的值 // 例如,可以将值赋给调用窗口的某个控件 SomeControl.Text = value; } ``` 在目标窗口中,当需要传递值给调用窗口时,触发委托事件并传递值: ```csharp private void PassValueButton_Click(object sender, EventArgs e) { string valueToPass = "Hello World"; ValuePassed?.Invoke(valueToPass); } ``` 这样,当调用窗口中的"OpenTargetWindowButton"按钮被点击时,会创建目标窗口的实例,并订阅目标窗口事件。当在目标窗口中点击"PassValueButton"按钮时,会触发委托事件并传递值给调用窗口事件处理方法。在事件处理方法中,可以对接收到的值进行处理,例如将其赋给调用窗口的某个控件。 希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值