3

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

现在的问题是,由于控件是在 Page_Init 事件中创建的,并且 SortOrder 稍后会在 ImageButton 命令事件被触发时更新。使用正确的 SortOrder 更新表的最佳过程是什么。如果我在事件触发后重新创建表,ImageButton 命令事件将不再起作用。

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

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

4

3 回答 3

8

页面事件(例如Init和)Load将始终在引发回发的事件处理程序之前触发。这是页面生命周期的基础(有关 Peter Bromberg 的可视化表示,请参见此处)。大多数刚接触 ASP.NET 的开发人员在理解和适当处理这种“困境”方面存在重大问题。

理想的方法是:

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

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

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

因此,第一次加载时的执行顺序是:

  1. Page_Init
  2. BindData()

后续加载(回发)的执行顺序是:

  1. Page_Init
  2. BindData()- 附加了 ImageButton 的事件处理程序。
  3. ImageButton_Click
  4. BindData()
于 2009-04-23T08:09:13.807 回答
4

你需要这样的东西...

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

点击按钮

  • OnInit (IsPostBack = true / 1st Postback)

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

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

引起其他一些回发

  • OnInit (IsPostBack = true / 2nd & Subsequent Postbacks)
    • 动态创建 ImageButton
    • 连线 ImageButton 事件处理程序
    • 加载表 - 检查会话/变量中的排序顺序。如果找到,请使用它。
于 2009-04-23T08:08:16.663 回答
1

首先,您似乎将数据手动绑定到 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);
}

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

于 2009-04-23T08:49:09.827 回答