如何从动态创建的usercontrol中引发事件

时间:2008-12-04 02:45:55

标签: asp.net events user-controls

如何从动态创建的用户控件中引发事件?

这是我正在尝试的代码,其中Bind是一个公共EventHandler

protected indDemographics IndDemographics;
protected UserControl uc;
override protected void OnInit(EventArgs e)
{
    uc = (UserControl)LoadControl("indDemographics.ascx");
    IndDemographics.Bind += new EventHandler(test_handler);
    base.OnInit(e);
}

我得到了IndDemographics的空对象。有人能指出我一个完整的代码示例吗? 提前谢谢......

3 个答案:

答案 0 :(得分:3)

首先,您需要确保在usercontrol的代码中定义了事件。

例如:

public class MyUserControl
  Inherits UserControl

  Public Event Bind(sender as object, e as EventArgs)

  public sub SomeFunction()
     RaiseEvent Bind(me, new EventArgS())
  End Sub
End Class

在此之后,您可以绑定到事件。现在,对于您的其他问题,您是动态加载此控件还是在ASPX端声明?如果它在您的ASPX端,那么您不需要LoadControl,因为在ASPX端声明一个对象为 Runat = Server 实例化该类的实例。

如果没有,那么您需要确保使用虚拟路径来获取ASCX文件的位置。 (在您的示例中,如果ASCX位于网站的根目录,则使用“〜/ indDemographics.ascx”)。此时,您需要将其添加到页面(或占位符或其他容器对象)。

无论您以何种方式实例化UserControl的实例,您都可以将事件处理程序与该类实例的事件相关联。例如:

Dim btn As New Button;
AddHandler btn.Click, AddressOf MyButtonClickEventHandler

现在,因为您在示例代码中获得了NULL引用。

使用LoadControl引用时,对象的实例位于 UC 变量中。在该示例中,您声明了两个对象,UC作为UserControl的类型,indDemographics作为indDemographics的类型。

当您使用LoadControl时,您将实例化indDemographics的实例并将其分配给UC。当您尝试将事件处理程序分配给IndDemographics变量时,它实际上从未实例化过。

最终,您的代码应该更加符合以下几点:

protected indDemographics IndDemographics;
override protected void OnInit(EventArgs e)
{
    indDemographics = LoadControl("~/indDemographics.ascx");
    IndDemographics.Bind += new EventHandler(test_handler);
    base.OnInit(e);
}

答案 1 :(得分:1)

我看到它(IndDemographics)已声明但从未实际创建过,所以我希望它仅使用此代码为空。

答案 2 :(得分:1)

感谢Stephen让我走上正轨。这是C#中的最终工作代码:

protected indDemographics IndDemo;
override protected void OnInit(EventArgs e)
{
    Control c = LoadControl("~/indDemographics.ascx");
    IndDemo = (indDemographics) c;
    IndDemo.Bind += new EventHandler(test_handler);
    place1.Controls.Add(IndDemo);
    base.OnInit(e);
}

将通用控件强制转换为indDemographics类非常重要。之后其他一切正常。