Question

J'ai ce code aspx: (exemple)

<asp:DropDownList runat="server" ID="ddList1"></asp:DropDownList>   

Avec ce code ci-dessous:

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();

La sortie ressemble à ceci:

<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>   

Ma question est la suivante: pourquoi mes valeurs (nombres) ont-elles disparu et le texte utilisé comme valeur ET le texte? Je sais que cela fonctionne si j'utilise la méthode ddList1.Items.Add (New ListItem ("text", "valeur")) , mais je dois utiliser une liste générique comme source de données pour autres raisons.

Était-ce utile?

La solution

La méthode DataBind ne liant des valeurs que si la propriété DataValueField est définie. Si vous définissez la propriété DataValueField sur " Value " avant d'appeler DataBind, vos valeurs apparaîtront sur le balisage.

UPDATE: vous devrez également définir la propriété DataTextField sur "Text". C'est parce que la liaison de données et l'ajout d'éléments manuellement ne fonctionnent pas de la même manière. La liaison de données ne connaît pas l’existence du type ListItem et génère un balisage en évaluant les éléments de la source de données.

Autres conseils

Et voici la méthode qui effectue la liaison de données. Vous pouvez voir exactement ce qui se passe:

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;
    }
}

Si vous construisez ListItems, vous n'avez pas besoin d'utiliser DataBind () en premier lieu.

Ajoutez-les simplement à votre liste déroulante:



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 () est utile lorsque vous avez déjà un objet collection / data (généralement un DataTable ou DataView) pouvant être utilisé en tant que DataSource, en définissant DataTextField et DataValueField (écrit par buyutec).

"Si vous construisez des articles de liste, vous n'avez pas besoin d'utiliser DataBind () en premier lieu."

L'ajout direct à la liste déroulante est un moyen facile (et le code de l'exemple étant le code correct), mais disons que vous avez une source de données non ordonnée et que vous souhaitez que les éléments de la liste soient triés.

Un moyen d'y parvenir serait de créer une liste générique de ListItem, puis d'utiliser la méthode de tri héritée avant la liaison de données à la liste.

Il y a beaucoup de wys pour peler un chat ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top