我正在尝试从主机页面处理动态加载的usercontrol的按钮单击事件。我的相关代码发布在下面,我想我正走在正确的道路上,但我需要做些什么来使这个功能正常?我目前正在收到“绑定到目标方法的错误”。当我尝试创建usercontrol时。提前感谢您的任何帮助!
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);
}
答案 0 :(得分:0)
我从这一行收到错误:委托处理程序= Delegate.CreateDelegate(ucEventInfo.EventHandlerType,ucType, ucMethInfo);
问题是您在传递UserControl实例时传递ucType
,所以尝试这样做:
Delegate handler = Delegate.CreateDelegate(ucEventInfo.EventHandlerType, ucLeadComm, ucMethInfo);
我不确定ucLeadComm
是否属于UserControl,因为我从未使用过LoadControl()
,所以如果不使用Activator.CreateInstance();
或使用{{1}它和GetContructor()
它可以创建对象的实例。
编辑1:
感谢您的回复,我现在收到“对象与目标不符 在下一行输入:ucEventInfo.AddEventHandler(ucType,handler);
同样在该行中,您应该传递Invoke()
的实例,而不是UserControl
。
编辑2:
非常感谢您的帮助!该项目建立并不抛出 任何错误。但是,我该如何将其重新绑定到方法中 在aspx页面内按钮实际执行某些操作 点击?
如果我在这种情况下理解你应该在 aspx.cs 中创建方法:
ucType
然后创建另一个public void btnComm_Click(object sender, EventArgs e)
{
//Here what you want to do in the aspx.cs
}
,创建一个handler
绑定到 aspx.cs 中包含的MethodInfo
并将其传递给btnComm_Click
:< / p>
Delegate.CreateDelegate()