Aggiunta di ListItems a DropDownList da un elenco generico
-
02-07-2019 - |
Domanda
Ho questo codice aspx: (esempio)
<asp:DropDownList runat="server" ID="ddList1"></asp:DropDownList>
Con questo codice dietro:
List<System.Web.UI.WebControls.ListItem> colors = new List<System.Web.UI.WebControls.ListItem>();
colors.Add(new ListItem("Select Value", "0"));
colors.Add(new ListItem("Red", "1"));
colors.Add(new ListItem("Green", "2"));
colors.Add(new ListItem("Blue", "3"));
ddList1.DataSource = colors;
ddList1.DataBind();
L'output è simile al seguente:
<select name="ddList1" id="ddList1">
<option value="Select Value">Select Value</option>
<option value="Red">Red</option>
<option value="Green">Green</option>
<option value="Blue">Blue</option>
</select>
La mia domanda è: perché i miei valori (numeri) sono scomparsi e il testo utilizzato come valore E il testo? So che funziona se utilizzo il metodo ddList1.Items.Add (New ListItem (" text " ;, " value "))
, ma devo utilizzare un elenco generico come origine dati per altri motivi.
Soluzione
Poiché il metodo DataBind associa i valori solo se è impostata la proprietà DataValueField. Se imposti la proprietà DataValueField su " Value " prima di chiamare DataBind, i tuoi valori appariranno sul markup.
AGGIORNAMENTO: dovrai anche impostare la proprietà DataTextField su " Testo " ;. È perché l'associazione dati e l'aggiunta manuale di elementi non funzionano allo stesso modo. Il database non conosce l'esistenza del tipo ListItem e genera markup valutando gli elementi nell'origine dati.
Altri suggerimenti
Ed ecco il metodo che esegue l'associazione dei dati. Puoi vedere esattamente cosa sta succedendo:
protected internal override void PerformDataBinding(IEnumerable dataSource)
{
base.PerformDataBinding(dataSource);
if (dataSource != null)
{
bool flag = false;
bool flag2 = false;
string dataTextField = this.DataTextField;
string dataValueField = this.DataValueField;
string dataTextFormatString = this.DataTextFormatString;
if (!this.AppendDataBoundItems)
{
this.Items.Clear();
}
ICollection is2 = dataSource as ICollection;
if (is2 != null)
{
this.Items.Capacity = is2.Count + this.Items.Count;
}
if ((dataTextField.Length != 0) || (dataValueField.Length != 0))
{
flag = true;
}
if (dataTextFormatString.Length != 0)
{
flag2 = true;
}
foreach (object obj2 in dataSource)
{
ListItem item = new ListItem();
if (flag)
{
if (dataTextField.Length > 0)
{
item.Text = DataBinder.GetPropertyValue(obj2, dataTextField, dataTextFormatString);
}
if (dataValueField.Length > 0)
{
item.Value = DataBinder.GetPropertyValue(obj2, dataValueField, null);
}
}
else
{
if (flag2)
{
item.Text = string.Format(CultureInfo.CurrentCulture, dataTextFormatString, new object[] { obj2 });
}
else
{
item.Text = obj2.ToString();
}
item.Value = obj2.ToString();
}
this.Items.Add(item);
}
}
if (this.cachedSelectedValue != null)
{
int num = -1;
num = this.Items.FindByValueInternal(this.cachedSelectedValue, true);
if (-1 == num)
{
throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", new object[] { this.ID, "SelectedValue" }));
}
if ((this.cachedSelectedIndex != -1) && (this.cachedSelectedIndex != num))
{
throw new ArgumentException(SR.GetString("Attributes_mutually_exclusive", new object[] { "SelectedIndex", "SelectedValue" }));
}
this.SelectedIndex = num;
this.cachedSelectedValue = null;
this.cachedSelectedIndex = -1;
}
else if (this.cachedSelectedIndex != -1)
{
this.SelectedIndex = this.cachedSelectedIndex;
this.cachedSelectedIndex = -1;
}
}
Se stai costruendo ListItems, non è necessario utilizzare DataBind () in primo luogo.
Basta aggiungerli al tuo DropDownList:
ddList1.Items.Add(new ListItem("Select Value", "0"));
ddList1.Items.Add(new ListItem("Red", "1"));
ddList1.Items.Add(new ListItem("Green", "2"));
ddList1.Items.Add(new ListItem("Blue", "3"));
DataBind () è utile quando si dispone già di un oggetto collection / data (di solito un DataTable o DataView) che può essere utilizzato come DataSource, impostando DataTextField e DataValueField (come ha scritto Buyutec).
" Se stai creando ListItems, non è necessario utilizzare DataBind () in primo luogo. "
L'aggiunta diretta all'elenco a discesa è il modo più semplice (e dato il codice di esempio quello giusto) ma supponiamo che tu abbia un'origine dati non ordinata e desideri che gli elementi dell'elenco vengano ordinati.
Un modo per raggiungere questo obiettivo sarebbe quello di creare un elenco generico di ListItem e quindi utilizzare il metodo di ordinamento ereditato prima di eseguire il database nell'elenco.
Ci sono molti modi per scuoiare un gatto ...