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 -", ""));
}
Grazie .. !! Ha aiutato – msbyuva
Thnx! funziona come un fascino – matskn
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ì). –