DropDownList AppendDataBoundItems (primo elemento a essere vuoto e duplicati non ammessi)
-
06-09-2019 - |
Domanda
Ho un DropDownList
all'interno di un UpdatePanel
che è popolata da un postback SqlDataSource
.È 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 aggiorna, gli elementi vengono aggiunti all' DropDownList
.Così il DropDownList
finisce per avere dei dati che non è corretto, o di dati ripetuti.
Ho l' AppendDataBoundItems
set di proprietà di true
perché ho bisogno di il primo elemento a essere vuoto.
Come posso superare questo problema?C'è un altro modo di avere un vuoto prima voce?
(Questo DropDownList
è in un ASP.NET web 2.0, app, e codebehind è in C#)
Soluzione
Invece di usare 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 -", ""));
}
Altri suggerimenti
Ci sono buone risposte qui, ma ho sentito il bisogno di includere ulteriori informazioni perché ci sono diverse opzioni che funzionano e dobbiamo decidere quale utilizzare.
In primo luogo, dobbiamo capire AppendDataBoundItems
. Se AppendDataBoundItems = "true"
, ListItems
sono aggiunti alla DropDownList
senza cancellare i vecchi. In caso contrario, il DropDownList
viene cancellato circa 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 le ListItems dal database per la DropDownList solo una volta.
Nota 3 cose qui:
-
ListItem
vuoto è definito in html -
AppendDataBoundItems="true"
-
DataBind
NON è chiamato postback o quando l'elementoDropDownList
count è> 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 postback sono spesso la causa di associazione dati duplicati, è possibile causare altri modi. Verifica del conteggio oggetto è fondamentalmente solo controllo per vedere se è già stato caricato.
O (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.
Nota 3 differenze rispetto alla prima opzione:
-
AppendDataBoundItems="false"
(se non è definito, allora èfalse
è valore di default) -
ListItem
vuoto viene viene aggiunto in codice dietro. Non possiamo definirlo in html perché conAppendDataBoundItems="false"
, sarebbe sgomberato. -
DataBind
viene chiamato su ogniPage_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 -", ""));
}
Si associa probabilmente che DropDownList nel codice dietro. Quindi non si dovrebbe farlo dopo il postback di nuovo:
// probably in Page_Load method
if (!Page.IsPostBack)
{
// do data binding here
};
Ecco un'idea, possiamo usare 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();
}
<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>
Ecco un'Idea.
C'è una proprietà nell'elenco a discesa chiamato AutoPostBack
impostare a true e quindi nel codice dietro si mettono tutti il metodo di associazione all'interno della if(!Page.IsPostBack)
.Che ha funzionato per me.
per quanto riguarda.
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>