日期:2014-05-19  浏览次数:20636 次

动态加载用户控件后如何注册事件?内详
加载用户控件的代码如下:
Assembly   ass   =   Assembly.LoadFrom(Assemblypath);
UserControl   obj   =   (UserControl)ass.CreateInstance(className);
obj.Dock   =   DockStyle.Fill;
splitContainer2.Panel2.Controls.Add(obj);
obj.BringToFront();

假设obj中有一个事件   SaveButtonEvent
我应该如何注册这个事件?

------解决方案--------------------
一样,既然你能动态创建其对象,当然也可以利用反射绑定其事件了
------解决方案--------------------
obj+=new 代理(事件方法名称);
------解决方案--------------------
obj+=new 事件代理(方法)
------解决方案--------------------
也可以自己写一个事件回调这类的
------解决方案--------------------
obj.GetType().GetEvent( "SaveButtonEvent ").AddEventHandler(obj,delegate);
delegate是你要响应的委托。
------解决方案--------------------
用一个最简单的方法,你定义一个接口让所有空间都继承并实现这个接口,这个接口需要实现,比如createEvent()方法,这个方法帮你注册你的事件
------解决方案--------------------
楼上几位可能误解我的意思了。我在说一边。
我要注册的事件是从Assembly.LoadFrom用反正加载动态加载进来的assembly中的事件。

===============首先你提问有问题
1,你是只响应事件的方法(也就是委托对象)在正要加载的assembly中吗?
2,或者event本身在正要加载的assembly中的某个对象中?

danjiewu(阿丹)的方法适合上面两个情况!
------解决方案--------------------
如果是给控件一个默认的通用事件,确实是通过+=就可以了.
如果这个事件不是通用的事件,而是控件中特有的,则要通赤AddEventHandler来添加,可以参考如下的代码:

private void button1_Click(object sender, EventArgs e)
{
Type t = typeof(SomeControl);
object obj = t.Assembly.CreateInstance(t.FullName);

EventInfo eventInfo = t.GetEvent( "OnSomeEvent ");

if (obj != null)
{
MethodInfo mi = this.GetType().GetMethod( "obj_Click ", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandler del = new EventHandler(this.obj_Click);
eventInfo.AddEventHandler(obj, del);
}
Control ctr = obj as Control;
if (ctr != null)
{
ctr.Visible = true;
ctr.SetBounds(0, 0, 50, 60);
this.Controls.Add(ctr);
}
}
private void obj_Click(object sender, EventArgs e)//可以是指定的EventArgs类型
{
MessageBox.Show( "动态添加的事件代码 ");
}