【发布时间】:2011-07-11 19:56:26
【问题描述】:
我很难订阅动态加载的用户控件中的事件。只看我遇到问题的代码可能是最简单的。非常感谢任何帮助。
在父页面我使用这个方法来动态加载用户控件。
private void LoadMyUserControl(string controlName)
{
parent.Controls.Clear();
// Load the user Control
UserControl MyControl = (UserControl)LoadControl(ControlName);
string userControlID = controlName.Split('.')[0];
MyControl.ID = userControlID.Replace("/","").Replace("~", "");
Type ucType = MyControl.GetType();
// Set misc parameters
PropertyInfo myProp = ucType.GetProperty("MyProp");
myProp.SetValue(MyControl, "MyVal", null);
//Dynamically subscribe to user control event
Type objectType = MyControl.GetType();
EventInfo objectEventInfo = objectType.GetEvent("updateParent");
Type objectEventHandlerType = objectEventInfo.EventHandlerType;
MethodInfo mi = this.GetType().GetMethod("HandledEvent");
Delegate del = Delegate.CreateDelegate(objectEventHandlerType, this, mi);
objectEventInfo.AddEventHandler(this, del);
}
public void HandledEvent (Object sender, EventArgs e)
{
}
我的用户控件有一个像这样的简单公共事件
public partial class MyUserControl1 : System.Web.UI.UserControl
{
public int MyProp { get; set; }
public event EventHandler updateParent;
}
我得到的错误出现在 ObjectEventInfo.AddEventHandler 行上,指出“对象与目标类型不匹配。”
再次提前感谢您的帮助。
【问题讨论】:
-
我想你会想要将你的 UserControl 转换为 MyUserControl1 与 UserControl。
-
当您可以创建一个具有事件引用的通用接口 IControl、转换为接口类型并以这种方式引用它时,为什么还要使用反射呢?这样,多个UC的满足签名,但可以引用它强类型...
-
我很欣赏这一点,但我真的在努力磨练我有限的反思技巧。难道不能通过反射来做到这一点吗?
标签: c# asp.net user-controls