1

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

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);
}
4

1 回答 1

0

我从这一行收到错误:Delegate handler = Delegate.CreateDelegate(ucEventInfo.EventHandlerType, ucType, ucMethInfo);

问题是您的传递ucType,而您应该传递您的 UserControl 的实例,所以尝试这样做:

Delegate handler = Delegate.CreateDelegate(ucEventInfo.EventHandlerType, ucLeadComm, ucMethInfo);

我不确定这ucLeadComm是 UserControl 的一个例子,因为我从来没有使用过,LoadControl()所以如果它不是 use: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
}

And then create another handler creating a MethodInfo tied to btnComm_Click contained in the aspx.cs and passing it to Delegate.CreateDelegate():

MethodInfo ucMethInfo = this.GetType().GetMethod("btnComm_Click");
于 2012-09-13T13:06:04.607 回答