2009-04-08 2 views
35

Ho uno DropDownList all'interno di uno UpdatePanel che è popolato sul postback da un SqlDataSource. Ha un parametro che è un altro controllo. A volte ho bisogno di più postback, ma quello che succede è che ogni volta che il pannello di aggiornamento si aggiorna, gli articoli vengono aggiunti allo DropDownList. Quindi lo DropDownList finisce con dati non corretti o ripetuti.DropDownList AppendDataBoundItems (il primo elemento deve essere vuoto e non duplicato)

Ho la proprietà AppendDataBoundItems impostata su true perché ho bisogno che il primo elemento sia vuoto.

Come posso risolvere questo problema? C'è un altro modo per avere un primo oggetto vuoto?

(Questo DropDownList è in una web app asp.net-2.0, e codebehind è in C#)

Grazie.

risposta

61

Invece di utilizzare AppendDataboundItems='true' (che farà sì che il problema si sta parlando), rispondere all'evento DataBound per la DropDownList e quindi aggiungere il vostro articolo "in bianco" in cima alla lista.

<asp:DropDownList runat="server" ID="MyList" 
    ondatabound="MyListDataBound"></asp:DropDownList> 

Poi nel codice dietro:

protected void MyListDataBound(object sender, EventArgs e) 
{ 
    MyList.Items.Insert(0, new ListItem("- Select -", "")); 
} 
+0

Grazie .. !! Ha aiutato – msbyuva

+0

Thnx! funziona come un fascino – matskn

+0

Sono l'unica persona che ha un problema con OnDataBound trovare il metodo che hai dichiarato di usare? Non sembra che stia cercando nel back-end del codice (nonostante l'intero DropDownList sia popolato e creato lì). –

0

Il codice funziona, cercare di dare un valore:

MyList.Items.Insert(0, new ListItem("- Select -", "0")); 
4

Probabilmente legano che DropDownList nel codice dietro. Quindi non si dovrebbe fare dopo il postback di nuovo:

// probably in Page_Load method 
if (!Page.IsPostBack) 
{ 
    // do data binding here 
}; 
1
<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server" 
    DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state"> 
    <asp:ListItem Text="(Select a State)" Value="" /> 
</asp:DropDownList> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>" 
    SelectCommand="SELECT DISTINCT [state] FROM [authors]"> 
</asp:SqlDataSource> 
0

ecco un'idea.

C'è una proprietà nell'elenco a discesa chiamato AutoPostBack impostato su true e quindi nel codice sottostante è stato inserito tutto il metodo di binding all'interno di if(!Page.IsPostBack). Questo ha funzionato per me.

saluti.

2

Ecco un'idea, possiamo utilizzare 2 eventi: DataBound e DataBinding:

protected void MyListDataBound(object sender, EventArgs e) 
{ 
    MyList.Items.Insert(0, new ListItem("- Select -", "")); 
} 

protected void MyListDataBinding(object sender, EventArgs e) 
{ 
    MyList.Items.Items.Clear(); 
} 
+0

Cancellare l'elenco nella funzione MyListDataBinding è effettivamente la stessa cosa dell'impostazione di AppendDataBoundItems = "false". –

3

Ci sono buone risposte qui, ma ho sentito il bisogno di includere ulteriori informazioni perché ci sono diverse opzioni che lavoro e dobbiamo decidere quale usare.

In primo luogo, dovremmo capire AppendDataBoundItems. Se AppendDataBoundItems = "true", ListItems vengono aggiunti allo DropDownList senza cancellare quelli vecchi. In caso contrario, lo DropDownList viene cancellato prima del prossimo DataBind. MSDN AppendDataBoundItems doc

ci sono fondamentalmente 2 opzioni coperti dalla maggior parte delle risposte:

1. Definire un'opzione vuota in html e aggiungere il ListItems dal database per la DropDownList solo una volta.

Avviso 3 cose qui:

  • Blank ListItem è definito in html
  • AppendDataBoundItems="true"
  • DataBind non è chiamato il postback o quando il conteggio DropDownList oggetto è> 1

Fonte:

<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" > 
    <asp:ListItem Text="- Select One -" Value="" /> 
</asp:DropDownList> 

codice dietro:

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    if (MyList.Items.Count <= 1) { 
     MyList.DataSource = MyDataSource; 
     MyList.DataBind(); 
    } 
} 

Nota: mi piace la logica del controllo del conteggio vs controllo IsPostBack. Anche se i PostBack sono spesso la causa del databinding duplicato, è possibile causarne altri modi. Il controllo del conteggio degli oggetti è fondamentalmente solo un controllo per vedere se è già stato caricato.

OR (possibilità di utilizzare IsPostBack invece)

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    if (!IsPostBack) { 
     MyList.DataSource = MyDataSource; 
     MyList.DataBind(); 
    } 
} 

2. Chiaro e ricaricare il DropDownList su ogni refresh della pagina.

Avviso 3 differenze rispetto alla prima opzione:

  • AppendDataBoundItems="false" (se non è definito, allora è false è valore di default)
  • Blank ListItem si è aggiunto nel codice dietro. Non possiamo definirlo in html perché con AppendDataBoundItems="false", sarebbe stato eliminato.
  • DataBind viene chiamato su ogni Page_Load

Fonte:

<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name" 
    OnDataBound="MyList_DataBound" > 
</asp:DropDownList> 

codice dietro:

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    MyList.DataSource = MyDataSource; 
    MyList.DataBind(); 
} 

protected void MyList_DataBound(object sender, EventArgs e) 
{ 
    MyList.Items.Insert(0, new ListItem("- Select One -", "")); 
} 
0

Just Add EnableViewState = "false" al tag discesa

<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource" 
DataTextField="Name" DataValueField="ID" EnableViewState="false" 
AppendDataBoundItems="true"> 
    <asp:ListItem Value="">Select</asp:ListItem> 
</asp:DropDownList>