Asp.net: aggiungi un elemento vuoto all'inizio dell'elenco a discesa


128

Perché il menu a discesa non mostra prima il mio elemento vuoto? Ecco quello che ho

drpList.Items.Add(New ListItem("", ""))

With drpList
    .DataSource = myController.GetList(userid)
    .DataTextField = "Name"
    .DataValueField = "ID"
    .DataBind()
End With

Modifica ~ Sono vincolante per un elenco di generazioni, potrebbe essere questo il colpevole?


1

Risposte:


275

Dopo il tuo database:

drpList.Items.Insert(0, new ListItem(String.Empty, String.Empty));
drpList.SelectedIndex = 0;

In alternativa, puoi creare un'istanza di ListItem, impostare la proprietà Selected su true e quindi inserirla in drpList come sopra.
skia.heliou,

3
Questo può aiutare chi cerca una risposta per lavorare con i dati sqlDataSource Nel mio caso, ho anche dovuto aggiungere drpList.AppendDataBoundItems = true; associarlo ai dati correnti nel metodo Page_Load
sabastienfyrre,

30

Puoi usare AppendDataBoundItems=trueper aggiungere facilmente:

<asp:DropDownList ID="drpList" AppendDataBoundItems="true" runat="server"><br/>
    <asp:ListItem Text="" Value="" /><br/>
</asp:DropDownList>

1
A VS non piace il tag <br /> e funziona senza di me. Questa è un'opzione così pulita, non so perché non abbia più voti.
Tony L.,

Ha funzionato come un fascino. Grazie per la soluzione in fase di progettazione.
DataCat Robin,

3
Non dimenticare di impostare Selected = "true"
Fandango68,

24

Il databinding ha luogo dopo aver aggiunto l'elemento vuoto dell'elenco e sostituisce ciò che è già presente, è necessario aggiungere l'elemento vuoto all'inizio dell'elenco dal controller o aggiungerlo dopo il databinding.

MODIFICARE:

Dopo aver cercato su Google rapidamente da ASP.Net 2.0 c'è una vera proprietà "AppendDataBoundItems" che puoi impostare per ... aggiungere gli elementi del database.

per i dettagli vedere

http://imar.spaanjaars.com/QuickDocId.aspx?quickdoc=281 o

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.appenddatabounditems.aspx


4
Una cosa che devi fare attenzione è far crescere il tuo elenco a discesa dopo ogni postback aggiungendo sempre gli stessi dati.
Keith Sirmons,

L'elemento vuoto non è presente o presente ma semplicemente non selezionato?
Sbatti il

Funzionerebbe se avessi quello vuoto nel tuo markup .aspx, quindi rilegato nel codice dietro.
John Sheehan,

13

Penso che un modo migliore sia inserire prima l'elemento vuoto, quindi associare i dati proprio come hai fatto tu. Tuttavia, è necessario impostare la AppendDataBoundItemsproprietà del controllo elenco.

Utilizziamo il seguente metodo per associare qualsiasi origine dati a qualsiasi controllo elenco ...

public static void BindList(ListControl list, IEnumerable datasource, string valueName, string textName)
{
    list.Items.Clear();
    list.Items.Add("", "");
    list.AppendDataBoundItems = true;
    list.DataValueField = valueName;
    list.DataTextField = textName;
    list.DataSource = datasource;
    list.DataBind();
}

7

Come "Whisk", il trucco sta nella proprietà "AppendDataBoundItems"

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        DropDownList1.AppendDataBoundItems = true;
        DropDownList1.Items.Insert(0, new ListItem(String.Empty, String.Empty));
        DropDownList1.SelectedIndex = 0;
    }
}

Grazie "Frusta"


5

Esegui il tuo database e quindi aggiungi quanto segue:

Dim liFirst As New ListItem("", "")
drpList.Items.Insert(0, liFirst)

3

sembra che tu stia aggiungendo un elemento vuoto e quindi il databinding, che svuoterebbe l'elenco; prova a inserire l'elemento vuoto dopo il databinding


quando lo faccio, la riga vuota appare in fondo.
Saif Khan,

È possibile specificare l'indice da inserire. Guarda la soluzione di JasonS.
AndyG,

@ [Saif Khan]: e se non funziona, inserisci la riga vuota nell'origine dati, quindi databind
Steven A. Lowe

3

semplice

alla fine

ddlProducer.Items.Insert(0, "");

1

ddlCategory.DataSource = ds;
ddlCategory.DataTextField = "CatName";
ddlCategory.DataValueField = "CatID";

Data 1:

ddlCategory.Items.Add(new ListItem("--please select--", "-1"));
ddlCategory.AppendDataBoundItems = true;
ddlCategory.SelectedIndex = -1;

ddlCategory.DataBind();

Data 2:

ddlCategory.Items.Insert(0, new ListItem("-- please select --", "0"));

(Testato OK)


0

Puoi anche avere un'unione della selezione vuota con la selezione che ha contenuto:

select '' value, '' name
union
select value, name from mytable

Guardando indietro, non consiglierei questo metodo se non solo in alternativa. Mi piace l'evento per motivi di flessibilità (OnDataBound = "mydropdown_DataBound"), ma nel mio caso attuale sto adottando (AppendDataBoundItems = "true") per motivi di semplicità.
CINCHAPPS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.