如何在事件处理后更新页面数据?

问题描述:

在Page_Init上,我创建了一个基于几个数据库表的动态创建控件的表。其中一个控件是用于将列表项移动到列表中的ImageButton。此事件处理程序执行的操作是更新数据库中的SortOrder列以查找受影响的项目。如何在事件处理后更新页面数据?

现在的问题是,由于控件是在Page_Init事件中创建的,而SortOrder稍后会在ImageButton命令事件触发时更新。使用正确的SortOrder更新表格的最佳步骤是什么?如果在事件触发后重新创建表格,则ImageButton命令事件不再起作用。

  • 我应该实现一种方法来更新表中的数据而不重新创建吗?
  • 事件发生后,我应该在代码中重新加载页面吗?

解决此问题的最佳方法是什么?

页的事件,如InitLoad将引发该回发事件处理程序之前总是闪光。这是Page lifecycle的基础(对于Peter Bromberg的视觉表示,see here)。大多数新开发ASP.NET的开发人员都有一个主要的问题理解和适当处理这个“尴尬”。

做到这一点,理想的方式是:

一个。你的Page_Init应该调用一个程序(我们将其称为BindData())以处理基于数据库数据的表的创建。此方法与绑定数据库数据并基于该绑定呈现UI元素的绑定方法类似。 IOW,您应该从Page_Init方法中删除表格创建代码,并将其置于一个单独的方法中,以便在需要时调用它。

重要注意事项:这个BindData()方法还处理动态创建的ImageButton控件的事件处理程序附加到控件。我们将这称为ImageButton_Click。这对控制事件在随后的回发中触发至关重要。

b。当您的ImageButton_Click方法执行时,它会调用BindData()方法来重新创建表及其绑定,但会使用新的排序顺序规则。

因此,在第一负载执行的顺序是:

  1. Page_Init
  2. BindData()

上后续加载执行(在回发)的顺序为:

  1. Page_Init
  2. BindData() - 附加ImageButton的事件处理程序。
  3. ImageButton_Click
  4. BindData()

你需要像这样...

  • 的OnInit(的IsPostBack = FALSE)
    • 动态创建的ImageButton
    • Wireup ImageButton的事件处理程序
    • 负载表 - 检查一会话/变量中的排序顺序。如果没有;使用默认

点击按钮

  • 的OnInit(的IsPostBack = TRUE /第一回发)

    • 动态地重新创造的ImageButton
    • Wireup的ImageButton事件处理程序
    • 负载表 - 与默认的排序顺序
  • ImageButton_OnClick(还是一样第一次回传)

    • 刷新表 - 与特定的排序顺序
    • 保存在ViewState中/ Session变量这种顺序变量

造成一些其他回传

  • 的OnInit(的IsPostBack = TRUE /第二&随后回发)
    • 动态创建的ImageButton
    • Wireup ImageButton的事件处理程序
    • 负载表 - 检查会话/变量中的排序顺序。如果找到了,使用它。
+0

心灵感应,我告诉你! +1 – Cerebrus 2009-04-23 08:12:37

首先,你似乎是手工绑定数据到UI控件。在Asp.Net中有许多方法可以避免使用内置的数据绑定技术。像GridView这样的许多控件允许从给定的数据源自动创建Html表。还有许多其他选项,包括中继器。

但是,您确实选择绑定数据,该技术是在每次通过页面生命周期的某个时间点重新绑定。

你需要......

  1. 绑定的排序顺序已经改变之后,你在第一页的负荷信息与默认的排序顺序
  2. 重新绑定在图像按钮的事件处理程序中的数据。

的代码会是这个样子......

private void Page_Load (...) 
{ 
    if (!IsPostBack) 
     //On First Load 
     BindData(defaultSoortOrder); 
    else 
     BindData(currentSortOrder);    
} 

private void ImageButton_Click (...) 
{ 
    currentSortOrder = newSortOrder; 
    BindData(currentSortOrder); 
} 

如果点击图像按钮,你将最终调用BindData两次。但这是必要的,因为页面回发可以从任何控件启动,您需要始终确保在页面加载时绑定数据。