On Page_Init我根据几个数据库表创建一个动态创建控件的表。其中一个控件是ImageButton,用于将列表项向上移动。此事件处理程序的作用是更新受影响项目的数据库中的SortOrder列。
现在的问题是,由于控件是在Page_Init事件中创建的,因此稍后在触发ImageButton命令事件时更新SortOrder。使用正确的SortOrder更新表的最佳步骤是什么。如果在事件触发后重新创建表,则ImageButton命令事件不再起作用。
您解决此问题的首选方法是什么?
答案 0 :(得分:8)
Init
和Load
等页面事件将始终在引发回发的事件处理程序之前触发。这是Page lifecycle的基础(对于Peter Bromberg的视觉表示,see here)。大多数ASP.NET新手都有一个重要的问题是理解和妥善处理这个“窘境”。
执行此操作的理想方法是:
一个。您的Page_Init
应该调用一个过程(让我们称之为BindData()
来说明),该过程根据数据库数据处理表的创建。此方法类似于绑定到数据库数据并基于该绑定呈现UI元素的绑定方法。 IOW,您应该从Page_Init
方法中删除表创建代码,并将其放在一个单独的方法中,以便在需要时调用它。
重要说明:此BindData()
方法还处理动态创建的ImageButton控件的事件处理程序附加到控件。我们称之为ImageButton_Click
。这对于在随后的回发中触发事件的控制至关重要。
湾执行ImageButton_Click
方法时,它会调用BindData()
方法重新创建表,并使用新的排序顺序重新绑定表。
因此,首次加载时的执行顺序为:
Page_Init
BindData()
后续加载(回发时)的执行顺序为:
Page_Init
BindData()
- 附加了ImageButton的Eventhandler。ImageButton_Click
BindData()
答案 1 :(得分:4)
你需要这样的东西......
点击按钮
OnInit(IsPostBack = true / 1st Postback)
ImageButton_OnClick(仍然是第一回发)
导致其他一些回发
答案 2 :(得分:1)
首先,您似乎手动将数据绑定到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。但这是必要的,因为页面回发可以从任何控件启动,您需要始终确保在页面加载时绑定数据。