繁体   English   中英

在事件处理程序之外的代码隐藏部分中,确定是否更改了所选索引或触发了自动回发事件

[英]Determine whether the selected index was changed or an autopostback event was triggered, in sections of the code-behind other than the event handler

我有一个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中的选择而导致的,则我希望该部分执行。 所以,用伪代码,我想要类似的东西:

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) { 
            [...]
        }
        [...]

我尝试定义一个全局布尔变量并将其在事件处理程序中设置为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给我以下错误:

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

对错误消息的搜索导致此答案 ,但这似乎无济于事,因为它依赖于事件处理程序,该事件处理程序在Page_Load()之后执行。

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


因此,我的问题分解如下(尽管其中一些问题本质上是相同的问题,具体取决于答案是什么):

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

如果在这种特殊情况下有更好的方法来实现我要完成的任务,我欢迎您提出建议,但我仍然想知道上述答案。

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

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

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

并非没有采用自定义技术。 页面事件生命周期内SelectedIndexChanged事件触发得太晚,无法用于您的方案。 一种选择是存储DropDownList.SelectedIndexPage.ViewState期间收集Page.OnPreRender ,然后比较这个值到新DropDownList.SelectedIndex期间,在回发Page_Load

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM