确定所选索引是否已更改或是否已触发autopostback事件,除了事件处理程序之外的代码隐藏部分

Adi*_*bar 1 c# asp.net selectedindex autopostback

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


我知道我可以像这样定义一个事件处理程序......

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

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

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

if (IsPostback && (! <DropDownList's selection was changed, causing an autopostback>)) {
Run Code Online (Sandbox Code Playgroud)

我尝试定义一个全局布尔变量并在事件处理程序中将其设置为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) { 
            [...]
        }
        [...]
Run Code Online (Sandbox Code Playgroud)

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

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

if (IsPostBack && !MyDropDownList.SelectedIndexChanged) {
Run Code Online (Sandbox Code Playgroud)

但Visual Studio给出了以下错误:

事件'System.Web.UI.WebControls.ListControl.SelectedIndexChanged'只能出现在+ =或 - ="的左侧

对错误消息的搜索导致了这个答案,但这似乎没有帮助,因为它依赖于在Page_Load()之后执行的事件处理程序.

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


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

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

如果有更好的方法来实现我在这个特殊情况下要完成的任务,我愿意接受建议,但我仍然想知道上面的答案.

Mat*_*oks 6

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

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

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

并非没有采用自定义技术.该SelectedIndexChanged事件触发的过程中来不及页面事件生命周期对你们有用的场景.一种选择是将期间存储DropDownList.SelectedIndexPage.ViewState集合中Page.OnPreRender,然后将此值DropDownList.SelectedIndex与后期期间的新值进行比较Page_Load.