我正在尝试处理从主机页动态加载的用户控件的按钮单击事件。我的相关代码发布在下面,我认为我走在了正确的道路上,但我还需要什么才能使这个功能正常运行?当我尝试创建用户控件时,我当前收到"绑定到目标方法时出错"。提前感谢您的帮助!
aspx
<asp:UpdatePanel ID="upLeadComm" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:PlaceHolder ID="phComm" runat="server"></asp:PlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
aspx.cs
else if (e.CommandName == "GetComm")
{
string[] cplArg = e.CommandArgument.ToString().Split('§');
UserControl ucLeadComm = (UserControl)LoadControl("Controls/Comments.ascx");
// Set the Usercontrol Type
Type ucType = ucLeadComm.GetType();
// Get access to the property
PropertyInfo ucPropLeadID = ucType.GetProperty("LeadID");
PropertyInfo ucPropLeadType = ucType.GetProperty("LeadType");
EventInfo ucEventInfo = ucType.GetEvent("BtnCommClick");
MethodInfo ucMethInfo = ucType.GetMethod("btnComm_Click");
Delegate handler = Delegate.CreateDelegate(ucEventInfo.EventHandlerType, ucType, ucMethInfo);
ucEventInfo.AddEventHandler(ucType, handler);
// Set the property
ucPropLeadID.SetValue(ucLeadComm, Convert.ToInt32(cplArg[0]), null);
ucPropLeadType.SetValue(ucLeadComm, cplArg[1], null);
phComm.Controls.Add(ucLeadComm);
upLeadComm.Update();
}
ascx.cs
public int LeadID { get; set; }
public string LeadType { get; set; }
public event EventHandler BtnCommClick;
public void btnComm_Click(object sender, EventArgs e)
{
BtnCommClick(sender, e);
}
我收到来自以下行的错误:委托处理程序=Delegate.CreateDelegate(ucEventInfo.EventHandlerType,ucType,ucMethInfo);
问题是,当你应该传递UserControl的一个实例时,你传递ucType
,所以试着这样做:
Delegate handler = Delegate.CreateDelegate(ucEventInfo.EventHandlerType, ucLeadComm, ucMethInfo);
我不确定ucLeadComm
是否是UserControl的一个距离,因为我从未使用过LoadControl()
,所以如果它不使用:Activator.CreateInstance();
或使用GetContructor()
和Invoke()
,它可以创建对象的实例。
编辑1:
感谢您的回复,我现在收到"对象与目标不匹配类型"在下一行:ucEventInfo.AddEventHandler(ucType,handler);
同样在这一行中,您应该传递UserControl
的实例,而不是ucType
。
编辑2:
非常感谢您的帮助!项目生成并且不抛出任何错误。然而,我该如何将其重新绑定到一个方法中在aspx页面中,当按钮点击?
如果我理解在这种情况下,您应该在aspx.cs:中创建方法
public void btnComm_Click(object sender, EventArgs e)
{
//Here what you want to do in the aspx.cs
}
然后创建另一个handler
,创建一个与aspx.cs中包含的btnComm_Click
绑定的MethodInfo
,并将其传递给Delegate.CreateDelegate()
:
MethodInfo ucMethInfo = this.GetType().GetMethod("btnComm_Click");