簡體   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