2012-01-02 9 views
8

Ho seguente codice semplice:Primo elemento in DropDownList non scatta SelectedIndexChanged affatto

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testForm.aspx.cs" Inherits="Orbs.testForm" %> 
<html> 
<body> 
    <form id="form1" runat="server"> 
     <asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged" ViewStateMode="Enabled"> 
      <asp:ListItem Value="1" Text="Item 1" /> 
      <asp:ListItem Value="2" Text="Item 2" /> 
      <asp:ListItem Value="3" Text="Item 3" /> 
      <asp:ListItem Value="4" Text="Item 4" /> 
      <asp:ListItem Value="5" Text="Item 5" /> 
     </asp:DropDownList> 
     <asp:Label runat="server" ID="label1"></asp:Label> 
    </form> 
</body> 
</html> 

E questo è il mio codice dietro

using System; 

namespace Orbs { 
    public partial class testForm: System.Web.UI.Page { 
     protected void Page_Load(object sender, EventArgs e) { 
      label1.Text = "???!!"; 
     } 

     protected void dropdown1_SelectedIndexChanged(object sender, EventArgs e) { 
      label1.Text = "Fired on " + dropdown1.SelectedValue; 
     } 

    } 
} 

Quando la prima volta che entro nella pagina, label1 mostra '???!!'. Ora seleziono un elemento dal menu a discesa e il valore corretto è label1 ma quando seleziono il primo elemento nel menu a discesa, viene visualizzato nuovamente ???!! anziché Fired on 1

Dove sto sbagliando?

Modifica: ho notato che se aggiungo Selected="True" a uno degli elementi nel menu a discesa, quell'elemento diventa vittima e non attiva l'evento!

+0

Ohhh, scusa puoi vedere il punto di rottura dell'evento? – IamStalker

+0

No, non si attiva quando seleziono il primo elemento. Selezionando il resto degli elementi lo sparerà – AaA

+0

beh, non penso che l'indice sia cambiato quando si seleziona il primo elemento, dal momento che è in realtà lo stesso indice al quale è caricato – V4Vendetta

risposta

3

ho risolto il problema io stesso,

ho letto da qualche parte che spegnendo il ViewStateMode causerà DropDownList non funzionare correttamente. Nella mia applicazione web ho dovuto spegnere ViewStateMode per ottenere qualche compito globale e accenderlo caso per caso.

In qualche modo accendere ViewStateMode su DropDownList non funziona, ho anche provato accendendo ViewStateMode per la pagina e la pagina master, ma ancora DropDownList non ha funzionato. ha funzionato solo quando ho attivato ViewStateMode in web.config.

Come l'accensione di ViewStateMode in web.config non è un'opzione, ho trovato e soluzione alternativa. Lo sto includendo qui sperando che aiuti qualcuno.

  • Aggiungi un HiddenField al modulo.
  • In Page_Load confronta valore HiddenField con Request.Forms[DropDownList1.UniqueID]
  • se sono diversi, chiamare SelectedIndexChanged manualmente
  • impostare il valore di HiddenField al valore di Request.Forms[DropDownList1.UniqueID].
+3

Solo per dare seguito a questo. Ho messo ViewStateMode = Enabled nel menu a tendina e questo ha risolto il problema. Forse qualcosa è cambiato tra ora e poi. – Edyn

+0

Se si controlla il mio codice di esempio, 'ViewStateMode = Enabled' è già presente ma l'ho disabilitato in' web.config' e non funzionava – AaA

+0

Mettere ViewStateMode = Enabled sul controllo a discesa ha funzionato anche per me. – Kayes

0

Questo sta accadendo perché si imposta l'etichetta su "??? !!" ogni evento della pagina.

È necessario modificare il carico della pagina per rilevare se un postback non si è verificato.

protected void Page_Load(object sender, EventArgs e) { 
     if(!IsPostBack) 
     { 
      label1.Text = "???!!"; 
     } 
    } 
+0

Ho già avuto la stessa risposta esatta da qualcun altro che ha cancellato il suo commento. se rimuovo la riga da 'Page_Load', l'evento' dropdown1_SelectedIndexChanged' non si attiva e l'etichetta rimane vuota – AaA

1

avuto lo stesso problema - SelectedIndexChanged non si attiva quando si seleziona la prima opzione, La mia soluzione non era pulita (non sono sicuro che era così intelligente, ma funziona per me),

Alla Page_Load I aggiunto il seguente script:

if (!IsPostBack) 
     { 

      //bind data first time 
     } 
     else 
     { 
      int ddlSortByValue = int.Parse(ddlSortBy.SelectedValue); 
      if (ddlSortByValue == 0) 
      { 
       ddlSortBy_SelectedIndexChanged(this, EventArgs.Empty); 
      } 

     } 

In questo modo forzo l'evento SelectedIndexChanged di accendere

+0

La tua soluzione funziona solo se il tuo primo oggetto nel menu a discesa è l'elemento selezionato (se un altro elemento dell'elenco è selezionato non funzionerà) ei tuoi valori dovrebbero essere numeri (non funzionerà se i tuoi valori sono string) – AaA

13

per chiunque continui ad avere il problema; L'ho risolto in un modo diverso, ma più semplice: Basta aggiungere un oggetto ListItem fittizio all'inizio di DropDownList e impostare la proprietà Enabled su false. cioè

<asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged" ViewStateMode="Enabled"> 
     <asp:ListItem Value="" Text="" Enabled="false" /> 
     <asp:ListItem Value="1" Text="Item 1" /> 
     <asp:ListItem Value="2" Text="Item 2" /> 
     <asp:ListItem Value="3" Text="Item 3" /> 
     <asp:ListItem Value="4" Text="Item 4" /> 
     <asp:ListItem Value="5" Text="Item 5" /> 
    </asp:DropDownList> 
+0

Questo dovrebbe sii la risposta corretta – Eddy

1

Questa domanda riguarda tutte le possibilità migliori di altri posti là fuori, quindi sono l'aggiunta di questa risposta esplicita. Nel mio caso il commento di @ Edyn ha funzionato, anche se il problema originale ha già questo:

Impostare ViewStateMode="Enabled" sul controllo a discesa stesso.
L'ho anche impostato sulla dichiarazione della pagina nella parte superiore della pagina, per ogni evenienza.

Questo è .Net 4.0, quindi forse qualcosa è stato modificato (ma certamente non risolto correttamente).

1

Ho avuto lo stesso problema, ma ho risolto chiamando onindexchanged funzione manualmente, in questo modo:

ddl_SelectedIndexChanged(null, null); 

So che questo non può essere il modo migliore, ma si sta lavorando per me.

+0

se chiami SelectedIndexChanged manualmente il tuo metodo verrà eseguito due volte se l'utente seleziona elementi diversi dal primo. – AaA

0

Nel mio caso, ciò è accaduto perché mi sono riferito a quel dropdown utilizzando una variabile dropdownlist locale e ho eliminato quella variabile al termine di una funzione. Stavo aggiungendo il primo elemento alla lista a cascata dopo aver impostato un'origine dati. Mi ci sono voluti 2 ore per trovarlo e ho funzionato perfettamente dopo aver rimosso la chiamata di smaltimento.

Problemi correlati