如何从动态创建的用户控件中引发事件?
这是我正在尝试的代码,其中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的空对象。有人能指出我一个完整的代码示例吗? 提前谢谢......
答案 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类非常重要。之后其他一切正常。