确定所选索引是否已更改或触发了autopostback事件,除了事件处理程序

时间:2015-06-01 22:11:57

标签: c# asp.net autopostback selectedindex

我有一个ASP DropDownList控件,AutoPostBack属性设置为true。当用户更改选择时,表单将按预期回发。我想知道如何在代码隐藏中确定页面是否因特定原因而回发。

<小时/> 我知道我可以像这样定义一个事件处理程序......

protected void MyDropDownList_SelectedIndexChanged(object sender, EventArgs e) {
    // Run some code if the selection for the "MyDropDownList" control was changed
}

...但我想知道的是如何检查表单是否回发,因为所选索引在事件处理程序之外被更改。

具体来说,在 Page_Load()方法中,我有一个if (IsPostback) {}部分,如果回发是由此引起的,我希望此部分执行更改DropDownList中的选择。所以,在伪代码中,我想要类似的东西:

if (IsPostback && (! <DropDownList's selection was changed, causing an autopostback>)) {

我尝试在事件处理程序中定义一个全局布尔变量并将其设置为 true ,然后在 Page_Load()中进行检查,如下所示:

public partial class MyWebApp : System.Web.UI.Page {
    [...]
    static bool selectedIndexChanged = false;
    [...]
    protected void DomainDropDownList_SelectedIndexChanged(object sender, EventArgs e) {
        selectedIndexChanged = true; // Set this flag to true if selected index was changed
    }
    [...]
    protected void Page_Load(object sender, EventArgs e) {
    [...]
        if (IsPostBack && selectedIndexChanged == false) { 
            [...]
        }
        [...]

由于我认为有经验的ASP.NET开发人员很容易发现:事件处理程序在 Page_Load()之后执行,无论代码的顺序如何,这都不起作用。

我还试图查看控件的 selectedIndexChanged 事件是否可以用作布尔条件,以确定是否触发了事件,如此

if (IsPostBack && !MyDropDownList.SelectedIndexChanged) {

但Visual Studio给出了以下错误:

  

事件&#39; System.Web.UI.WebControls.ListControl.SelectedIndexChanged&#39;只能出现在+ =或 - =&#34;

的左侧

对错误消息的搜索导致this answer,但这似乎没有帮助,因为它依赖于在 Page_Load()之后执行的事件处理程序。 / p>

在我的特定用例中,只有一个DropDownList和另一种提交表单的方式(提交按钮),检查所选索引是否已更改,是否触发了AutoPostBack同样有效,或者是否单击了提交按钮,但我也想知道如何在更广泛的场景中执行此操作,例如,如果有多个AutoPostBack控件和/或多种方式提交除AutoPostBack之外的表单。

<小时/>

所以,我的问题分解如下(虽然其中一些可能基本上是同一个问题,取决于答案是什么):

  • 是否有办法一般性地确定是否触发了AutoPostBack,而不是因为任何其他原因(例如点击按钮)发回的表单?
  • 有没有办法确定是否触发了特定控件的AutoPostBack(即如果有多个AutoPostBack控件为true,是否可以确定哪个控件导致AutoPostBack)?< / LI>
  • 是否可以检查Page_Load()方法中的或在SelectedIndexChanged事件处理程序之前执行的任何其他代码是否更改了DropDownList的选定索引?

如果有更好的方法来实现我在这个特定情况下想要完成的事情,我可以接受建议,但我仍然想知道答案(s )到上面。

1 个答案:

答案 0 :(得分:6)

Page_Load检查Page.Request.Form["__EVENTTARGET"]期间。这将包含一个标识符,表示导致回发的控件。通过此,您应该能够确定回发是否是由您感兴趣的控件引起的。

if (IsPostBack && Request.Form["__EVENTTARGET"] != "<control ID>") {
    ...
}
  

是否可以检查Page_Load()方法或在SelectedIndexChanged事件处理程序之前执行的任何其他代码是否已更改DropDownList的选定索引?

不依赖于自定义技术。 SelectedIndexChanged事件在page event lifecycle期间触发太晚,对您的方案有用。一种选择是在DropDownList.SelectedIndex期间将Page.ViewState存储到Page.OnPreRender集合中,然后在DropDownList.SelectedIndex期间将此值与帖子后面的新Page_Load进行比较。