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

时间:2012-09-13 12:42:17

标签: c# asp.net user-controls event-handling

我正在尝试从主机页面处理动态加载的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);
}

1 个答案:

答案 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()