如何在事件处理后更新页面数据?
在Page_Init上,我创建了一个基于几个数据库表的动态创建控件的表。其中一个控件是用于将列表项移动到列表中的ImageButton。此事件处理程序执行的操作是更新数据库中的SortOrder列以查找受影响的项目。如何在事件处理后更新页面数据?
现在的问题是,由于控件是在Page_Init事件中创建的,而SortOrder稍后会在ImageButton命令事件触发时更新。使用正确的SortOrder更新表格的最佳步骤是什么?如果在事件触发后重新创建表格,则ImageButton命令事件不再起作用。
- 我应该实现一种方法来更新表中的数据而不重新创建吗?
- 事件发生后,我应该在代码中重新加载页面吗?
解决此问题的最佳方法是什么?
页的事件,如Init
和Load
将引发该回发事件处理程序之前总是闪光。这是Page lifecycle的基础(对于Peter Bromberg的视觉表示,see here)。大多数新开发ASP.NET的开发人员都有一个主要的问题理解和适当处理这个“尴尬”。
做到这一点,理想的方式是:
一个。你的Page_Init
应该调用一个程序(我们将其称为BindData()
)以处理基于数据库数据的表的创建。此方法与绑定数据库数据并基于该绑定呈现UI元素的绑定方法类似。 IOW,您应该从Page_Init
方法中删除表格创建代码,并将其置于一个单独的方法中,以便在需要时调用它。
重要注意事项:这个BindData()
方法还处理动态创建的ImageButton控件的事件处理程序附加到控件。我们将这称为ImageButton_Click
。这对控制事件在随后的回发中触发至关重要。
b。当您的ImageButton_Click
方法执行时,它会调用BindData()
方法来重新创建表及其绑定,但会使用新的排序顺序规则。
因此,在第一负载执行的顺序是:
Page_Init
BindData()
上后续加载执行(在回发)的顺序为:
Page_Init
-
BindData()
- 附加ImageButton的事件处理程序。 ImageButton_Click
BindData()
你需要像这样...
- 的OnInit(的IsPostBack = FALSE)
- 动态创建的ImageButton
- Wireup ImageButton的事件处理程序
- 负载表 - 检查一会话/变量中的排序顺序。如果没有;使用默认
点击按钮
-
的OnInit(的IsPostBack = TRUE /第一回发)
- 动态地重新创造的ImageButton
- Wireup的ImageButton事件处理程序
- 负载表 - 与默认的排序顺序
-
ImageButton_OnClick(还是一样第一次回传)
- 刷新表 - 与特定的排序顺序
- 保存在ViewState中/ Session变量这种顺序变量
造成一些其他回传
- 的OnInit(的IsPostBack = TRUE /第二&随后回发)
- 动态创建的ImageButton
- Wireup ImageButton的事件处理程序
- 负载表 - 检查会话/变量中的排序顺序。如果找到了,使用它。
首先,你似乎是手工绑定数据到UI控件。在Asp.Net中有许多方法可以避免使用内置的数据绑定技术。像GridView这样的许多控件允许从给定的数据源自动创建Html表。还有许多其他选项,包括中继器。
但是,您确实选择绑定数据,该技术是在每次通过页面生命周期的某个时间点重新绑定。
你需要......
- 绑定的排序顺序已经改变之后,你在第一页的负荷信息与默认的排序顺序
- 重新绑定在图像按钮的事件处理程序中的数据。
的代码会是这个样子......
private void Page_Load (...)
{
if (!IsPostBack)
//On First Load
BindData(defaultSoortOrder);
else
BindData(currentSortOrder);
}
private void ImageButton_Click (...)
{
currentSortOrder = newSortOrder;
BindData(currentSortOrder);
}
如果点击图像按钮,你将最终调用BindData两次。但这是必要的,因为页面回发可以从任何控件启动,您需要始终确保在页面加载时绑定数据。
心灵感应,我告诉你! +1 – Cerebrus 2009-04-23 08:12:37