Asp.net - Ajouter un élément vide en haut de la liste déroulante


128

Pourquoi la liste déroulante ne montre-t-elle pas d'abord mon élément vierge? Voici ce que j'ai

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

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

Edit ~ Je suis lié à une Generig List, cela pourrait-il être le coupable?


Réponses:


275

Après votre databind:

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

Vous pouvez également instancier un ListItem, définir sa propriété Selected sur true, puis l'insérer dans drpList comme ci-dessus.
skia.heliou

3
Cela peut aider ceux qui recherchent une réponse à travailler avec les données sqlDataSource Dans mon cas, j'ai également dû ajouter drpList.AppendDataBoundItems = true; pour le lier aux données actuelles dans la méthode Page
Load

30

Vous pouvez utiliser AppendDataBoundItems=truepour ajouter facilement:

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

1
VS n'aime pas la balise <br /> et ça marche pour moi sans elle. C'est une option tellement propre, je ne sais pas pourquoi elle n'a pas plus de votes.
Tony L.

A travaillé comme un charme. Merci pour la solution de conception.
DataCat Robin

3
N'oubliez pas de définir Selected = "true"
Fandango68

24

La liaison de données a lieu une fois que vous avez ajouté votre élément de liste vide et remplace ce qui existe déjà, vous devez ajouter l'élément vide au début de la liste à partir de votre contrôleur, ou l'ajouter après la liaison de données.

ÉDITER:

Après avoir effectué une recherche rapide sur Google à partir d'ASP.Net 2.0, il existe une véritable propriété "AppendDataBoundItems" que vous pouvez définir pour ... ajouter les éléments liés aux données.

pour plus de détails, voir

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

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


4
Vous devez faire attention à ce que votre liste déroulante augmente après chaque publication en ajoutant les mêmes données encore et encore.
Keith Sirmons

L'élément vierge n'est-il pas là, ou là, mais tout simplement pas sélectionné?
Fouet

Cela fonctionnerait si vous aviez le blanc dans votre balisage .aspx, puis lié dans le code derrière.
John Sheehan

13

Je pense qu'une meilleure façon est d'insérer d'abord l'élément vierge, puis de lier les données comme vous l'avez fait. Cependant, vous devez définir la AppendDataBoundItemspropriété du contrôle de liste.

Nous utilisons la méthode suivante pour lier n'importe quelle source de données à n'importe quel contrôle de liste ...

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

Comme "Whisk" Said, l'astuce est dans la propriété "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;
    }
}

Merci "Whisk"


5

Faites votre liaison de données, puis ajoutez ce qui suit:

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

3

il semble que vous ajoutez un élément vide, puis une liaison de données, ce qui viderait la liste; essayez d'insérer l'élément vide après la liaison de données


quand je fais cela, la ligne vide apparaît en bas.
Saif Khan

Vous pouvez spécifier l'index dans lequel insérer. Regardez la solution de JasonS.
AndyG

@ [Saif Khan]: et si cela ne fonctionne pas, insérez la ligne vide dans votre source de données, puis databind
Steven A. Lowe

3

Facile

enfin

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

1

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

Cách 1:

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

ddlCategory.DataBind();

Cách 2:

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

(Testé OK)


0

Vous pouvez également avoir une union de la sélection vide avec la sélection qui a du contenu:

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

Avec le recul, je ne recommanderais pas cette méthode, sauf uniquement comme alternative. J'aime l'événement par souci de flexibilité (OnDataBound = "mydropdown_DataBound"), mais dans mon cas actuel, j'adopte le (AppendDataBoundItems = "true") par souci de simplicité.
CINCHAPPS
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.