Delegates,UpdatePanels和ascx控件

时间:2011-02-16 21:17:00

标签: c# asp.net delegates

我构建了一个ascx控件,它是我应用程序的许多不同组件的一部分。此控件上有一个Previous和Next按钮,应该向父aspx页面发出信号。这是通过让父页面为回发添加一些代表来完成的,例如OnPreviousClicked,OnNextClicked等。

此应用中的所有内容均为“ajaxified”,并带有更新面板。现在我注意到如果我没有在父级中的每一个Page_Load调用上设置委托,我的应用程序就会中断。换句话说,如果我不总是在父aspx的Page_Load中设置委托,那么ascx会以null委托和异常结束。我能正确编码吗?

4 个答案:

答案 0 :(得分:2)

如果您所做的只是发出点击按钮的信号,我会让您的ASCX控件发起一个简单的事件。这样,每个页面都可以在需要时监听事件,并且无论是否有人在监听,控件都可以正常运行。

首先在ASCX代码隐藏中声明事件:

public event System.EventHandler NextSelected;

然后,您可以创建引发事件的按钮单击事件。

protected void btnNextSelected_Click(object sender, EventArgs e)
{
   if (EmployeeSelected != null) 
   {
      NextSelected(this, new EventArgs());
   }
}

然后在您的父ASP.Net页面中,您可以添加ASCX控件(我们称之为NavControl)并创建侦听这些事件的方法。

NavControl.NextSelected += new EventHandler(NextPageRedirect);

protected void NextPageRedirect(object sender, EventArgs e)
{
    Response.Redirect("~/ViewEmployee.aspx", false);

}

请注意,使用此功能,您无需创建事件处理程序或方法,仍可以在页面上使用导航控件。它还应该消除你与代表们的问题。

答案 1 :(得分:2)

//在控件内

public event EventHandler OnPreviousClicked;

private void PreviousButton_OnClick(object sender, EventArgs e)
{
  if(OnPreviousClicked != null) {
    OnPreviousClicked(this, e); // or whatever args you want
  }
}

//并在页面代码隐藏

private void Page_Load(...)
{
   MyUserControl.OnPreviousClicked += new EventHandler(myHandler);
}

//在页面aspx中,您也可以设置OnPreviousClicked属性。

<xx:MyUserControl ID="MyUserControl1" runat="server" OnPreviousClicked="myHandler" />

请参阅http://asp.net-tutorials.com/user-controls/events/

答案 2 :(得分:1)

记住每个回发都必须重新启动你的代码。事件处理程序不会被序列化到viewstate,因此您必须重新设置它们。

答案 3 :(得分:1)

这是asp.net中的预期行为。

即使是部分回发(更新面板),也会发生整个page life cycle。因此,为了触发事件,您必须在page_load期间以编程方式连接它们或在标记中以声明方式连接它们(如果您提到的那些代理是事件)。