处理动态加载的用户控件的按钮单击事件



我正在尝试处理从主机页动态加载的用户控件的按钮单击事件。我的相关代码发布在下面,我认为我走在了正确的道路上,但我还需要什么才能使这个功能正常运行?当我尝试创建用户控件时,我当前收到"绑定到目标方法时出错"。提前感谢您的帮助!

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");

相关内容

  • 没有找到相关文章

最新更新