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

时间:2009-04-23 07:38:38

标签: asp.net event-handling page-lifecycle

On Page_Init我根据几个数据库表创建一个动态创建控件的表。其中一个控件是ImageButton,用于将列表项向上移动。此事件处理程序的作用是更新受影响项目的数据库中的SortOrder列。

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

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

您解决此问题的首选方法是什么?

3 个答案:

答案 0 :(得分:8)

InitLoad等页面事件将始终在引发回发的事件处理程序之前触发。这是Page lifecycle的基础(对于Peter Bromberg的视觉表示,see here)。大多数ASP.NET新手都有一个重要的问题是理解和妥善处理这个“窘境”。

执行此操作的理想方法是:

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

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

湾执行ImageButton_Click方法时,它会调用BindData()方法重新创建表,并使用新的排序顺序重新绑定表。

因此,首次加载时的执行顺序为:

  1. Page_Init
  2. BindData()
  3. 后续加载(回发时)的执行顺序为:

    1. Page_Init
    2. BindData() - 附加了ImageButton的Eventhandler。
    3. ImageButton_Click
    4. BindData()

答案 1 :(得分:4)

你需要这样的东西......

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

点击按钮

  • OnInit(IsPostBack = true / 1st Postback)

    • 动态重新创建ImageButton
    • Wireup ImageButton事件处理程序
    • 加载表 - 使用默认排序顺序
  • ImageButton_OnClick(仍然是第一回发)

    • 重新载入表格 - 具有特定的排序顺序
    • 在Viewstate / Session变量
    • 中保存此排序顺序变量

导致其他一些回发

  • OnInit(IsPostBack = true / 2nd&后续回发)
    • 动态创建ImageButton
    • Wireup ImageButton事件处理程序
    • 加载表 - 检查会话/变量中的排序顺序。如果是FOUND,请使用它。

答案 2 :(得分:1)

首先,您似乎手动将数据绑定到UI控件。在Asp.Net中,有许多方法可以使用内置的数据绑定技术来避免这种情况。许多控件(如GridView)允许从给定数据源自动创建Html表。还有很多其他选择,包括中继器。

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

你需要......

  1. 使用默认排序顺序将第一页加载的数据绑定
  2. 在排序顺序更改后,重新绑定图像按钮的事件处理程序中的数据。
  3. 代码看起来像这样......

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

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