0

我有一个网站,我目前正在使用通常的 WebForm 东西和 ASP.NET AJAX 1.0 在 ASP.NET 2.0 中工作。是否可以在 Page.Load 事件之后将事件绑定到动态创建的控件?

我有一个类似于此代码的动态创建的 table <td> 元素:

' Create Link Button
lnk.ID = String.Format("lnkDetails_{0}", dr("Id"))
lnk.Text = dr("Name").ToString()
lnk.CommandArgument = dr("Id").ToString()
AddHandler lnk.Click, AddressOf DetailsLink_Click
cName.Controls.Add(lnk)

此代码针对数据库中的每一行进行循环(当然还有更多单元格添加到表中,包括带有事件的 ImageButton。当我在导致并包括 Page.Load 的事件期间执行此代码时,这些事件完美地工作.我需要能够用当前数据填充此表,该数据在页面上其他地方的 btnClick 事件期间更新,该事件发生在此 Page_Load 事件之后,所以我用旧数据填充。如果我将此代码更改为 Page.LoadComplete ,事件停止工作。

此数据是应用程序各种组件的摘要显示,例如某人的姓名,当在“详细”表单上更新时,通过部分回发(要求)更新数据库,然后需要在此“摘要”中显示更新' 更新后的部分。目前,实际上需要 2 次回发才能真正看到“摘要”部分中的更改,因此摘要实际上比更改落后了 1 步(像泥巴一样清晰?)

什么是我用当前数据填充此表的最佳方式(在 Page.LoadComplete 期间/之后可用),但在单击链接时仍然会触发事件(该事件导致 UpdatePanel 显示“详细信息”形式)。

我还可以使用 jQuery 和常用的 ASP.NET AJAX 方法,而且 javascript 也是网站的要求,所以我不需要为不受支持的浏览器降级。

这是我的第一个 ASP.NET Web 应用程序,需要一些帮助来找出实现这一目标的最佳方法(我精通 PHP、Django 和制作 Web 表单的常用方法 - 比如在一个页面上拥有多个表单 o_O )。

更新:

在 Page_Load 之后确实没有将控件事件绑定到控件的好方法。页面的整体架构是一个包含整个页面的 ASP.NET 表单,只有 1 个 aspx 页面。我正在使用母版页(但是它对我的问题没有任何明显的影响)。

页面分为左右“窗格”,左侧是所有数据的摘要(在更新面板中),右侧“窗格”有 6 个“选项卡”,每个选项卡都实现为自己的用户控件,每个选项卡都有几个表单字段和更新按钮都在它自己的更新面板中。

任何这些选项卡上的更新只会刷新摘要面板 ( UpdatePanel.update()) 及其自己的面板。来自 db 的摘要的动态控件的“刷新”和事件绑定发生在 Page_Load 期间,并且 Update Button 事件更新 db 数据。(控制事件发生在 Page_Load 之后)。我想避免重复发布以更新摘要,任何想法都是有帮助的。

4

3 回答 3

1

在“页面其他位置的 btnClick 事件”中的数据更改后,您需要回发整个页面。听起来您有一个 UpdatePanel,听起来这正在捕获您的 btnClick 事件处理程序的回发。将 btnClick 放在 UpdatePanel 之外或更改其触发器,以便您的 btnClick 强制回发/刷新您的数据。或者,重新设计您的表格,使其在您单击 btnClick 时进行 AJAXly 刷新,如果不了解更多有关页面结构和控件的信息,很难获得更多详细信息。

祝你好运!

于 2008-11-26T18:53:14.413 回答
1

您可以随时绑定到事件。毕竟这只是一个简单的事件。但并非所有地方都适合,因为您必须考虑事件何时触发。在大多数情况下,这发生在 Page_Load 和 Page_PreRender 之间。这包括 LinkBut​​ton 上的单击事件。一般来说,我建议在 Page_Init 阶段添加您动态创建的控件。

于 2008-11-28T20:06:38.387 回答
0

您必须在 Page.Load 之前添加控件,以便在回发之间维护 ViewState,因此请使用 OnInit 事件处理程序。

但是一旦添加它们,您应该能够在 Page.Load 期间或之后的任何时间绑定事件处理程序(例如 OnClick)......例如在网格的 ItemDataBound (或类似的东西)或 Page.PreRender .

于 2008-11-26T18:04:08.383 回答