PRB: Technologie ASP.NET vyvolá události změny i v případě, že se nezmění hodnota ovládacího prvku

Příznaky

Za určitých okolností ASP.NET vyvolá Změna události pro ovládací prvek technologie ASP.NET i v případě, že se nezmění ovládacího prvku.

Příčina

Některé ovládací prvky, jako je událost SelectedIndexChanged ovládacího prvku DropDownList nebo TextChanged události v ovládacím prvku TextBox spoléhají na registraci události Change použít stav zobrazení. Zaznamenáte tento problém při vytváření těchto ovládacích prvků dynamicky po události se připojili.

Když technologie ASP.NET vykreslí stránku do prohlížeče, ovládací prvky, které jsou vytvářeny dynamicky nemají přidruženou událost změnit. Vzhledem k tomu, že je k dispozici žádné události, technologie ASP.NET neuloží stav zobrazení. Toto se nazývá zobrazení stav optimalizace.

Když je stránka odeslána zpět a události se připojili, ASP.NET očekává stav zobrazení, ale zjistí, že žádný neexistuje. Tento rozdíl je události Change, i v případě, že ovládací prvek nebyl změněn.

Řešení

Ujistěte se před ASP.NET vykreslí stránku připojili události Change dynamicky vytvářených ovládacích prvků. Tím zajistíte, že stav zobrazení pro ovládací prvek existuje.

Stav

Toto chování je záměrné.

Další informace

Kroky pro reprodukci chování

Vytvořit webový formulář

  1. Vytvořte novou aplikaci Visual Basic ASP.NET s názvem ChangeFired.
  2. Otevřete formulář WebForm1 v režimu návrhu. Přetáhněte ovládací prvek DataList ovládací prvek Button a DataSet ovládací prvek do formuláře.
  3. V dialogovém okně Přidat DataSet netypovou datasetklepněte a potom klepněte na tlačítko OK. Zachovat výchozí názvy pro všechny ovládací prvky.
  4. Úprava tabulky kolekce pro DataSet1. Přidáte novou tabulku s názvem Tabulka1.
  5. Upravte kolekci sloupce Tabulka1. Přidáte nový sloupec s názvem Sloupec1.
  6. DataList1klepněte a potom změňte vlastnost DataSource na DataSet1.
  7. Klepněte pravým tlačítkem myši DataList1, přejděte na Upravit šablonua potom klikněte na Šablony položky. Přetáhněte ovládací prvek DropDownList části ItemTemplate .
  8. DropDownList1klepněte a poté přidat do kolekce položek pět položek. Nastavit Text a hodnotu vlastnosti těchto položek do jedné,
    dva, tři,
    čtyřia pětv uvedeném pořadí.
  9. Nastavte vlastnost AutoPostBack na hodnotu true pro DropDownList1.
  10. Upravte vlastnosti DataBinding kolekce pro DropDownList1. Vlastnost SelectedIndex přidejte následující výraz vlastní vazby:
    DataBinder.Eval(Container, "DataItem.Column1")
  11. Přepněte do zobrazení HTML. Nastavte atribut trace na true v @ Page směrnice takto:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="ChangeFired.WebForm1" trace="true" %>

Přidání souboru kódu na pozadí

  1. Klepněte pravým tlačítkem myši WebForm1.aspx a potom klepněte na tlačítko Zobrazit kód.
  2. Přidejte následující kód události Page_Load :
    DataSet1.Tables(0).Rows.Add(New Object() {"1"})DataSet1.Tables(0).Rows.Add(New Object() {"2"})
    DataSet1.Tables(0).Rows.Add(New Object() {"3"})
    DataSet1.Tables(0).Rows.Add(New Object() {"4"})

    If Not IsPostBack Then
    DataBind()
    End If

    Dim objItem As DataListItem
    For Each objItem In DataList1.Items
    AddHandler CType(objItem.FindControl("DropDownList1"), _
    DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged
    If Not objItem.FindControl("DropDownList1") Is Nothing Then
    Trace.Write("Added SelectedIndexChanged Handler")
    End If
    Next

  3. Vytvořte nové proceduru Sub pod takto zpracovat událost SelectedIndexChanged události Page_Load :
    Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object, _ByVal e As System.EventArgs)
    DataBind()
    Trace.Write("SelectedIndexChanged, DataBind()")

    'Uncomment the following code to resolve this problem.
    'Dim objItem As DataListItem
    'For Each objItem In DataList1.Items
    ' AddHandler CType(objItem.FindControl("DropDownList1"), _
    ' DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged
    'Next
    End Sub

Spuštění vzorku

  1. Spusťte stránku. Všimněte si, že dynamicky vytvářených ovládacích prvků DropDownList obsahovat stav zobrazení informace trasování pro stromové struktury ovládacích prvků.

    K tomu dochází, protože volání metody DataBind dynamicky vytvoří ovládací prvky DropDownList a jste připojili obslužnou rutinu události, po DataBind volat v události Page_Load . Vzhledem k tomu, že ovládací prvky obslužnou rutinu události, zobrazení stav optimalizace nekoná.
  2. Klepněte na tlačítko na stránce. Všimněte si, že odeslání zpět a spustí kód v události Page_Load . Stav zobrazení existuje pro ovládací prvky DropDownList , protože obslužné rutiny události je přidružena s ovládacím prvkem.
  3. Změňte hodnotu v DropDownList ovládacího prvku. Všimněte si, že dojde k odeslání zpět. Dále si všimněte, že technologie ASP.NET vyvolá událost Page_Load a spustí události DropDownList1_SelectedIndexChanged .
  4. V události DropDownList1_SelectedIndexChanged volejte metodu DataBind znovu a vytvořte nové ovládací prvky DropDownList .

    Vzhledem k tomu, že událost SelectedIndexChanged není připojených k tyto nové ovládací prvky DropDownList , technologie ASP.NET používá optimalizace zobrazení stavu a neuloží stav zobrazení pro nové ovládací prvky DropDownList .
  5. Zkontrolujte trasovací informace pro stromové struktury ovládacích prvků. Všimněte si, že ovládací prvky DropDownList nemají stav zobrazení.
  6. Klepněte na tlačítko na stránce. Všimněte si, že dojde k zaúčtování zpět a Všimněte si, že technologie ASP.NET spustí událost Page_Load . Vzhledem k tomu, že je zaujmete SelectedIndexChanged událostí pro ovládací prvky DropDownList , ASP.NET očekává stav zobrazení má být přidružena ovládací prvky.

    Nicméně vzhledem k tomu, že stav zobrazení není k dispozici, ASP.NET vyvolá událost SelectedIndexChanged , přestože vyberete položku.

Řešení

Chcete-li vyřešit tento problém, Odkomentujte kód v události DropDownList1_SelectedIndexChanged tak, aby připojit obslužné rutiny událostí s nově vytvořených ovládacích prvků.
Vlastnosti

ID článku: 314809 - Poslední kontrola: 20. 1. 2017 - Revize: 1

Váš názor