Il y a de bonnes réponses ici mais j'ai ressenti le besoin d'inclure plus d'informations car il y a plusieurs options qui fonctionnent et nous devons décider laquelle utiliser.
Tout d'abord, nous devons comprendre AppendDataBoundItems
. Si AppendDataBoundItems = "true"
, ListItems
sont ajoutés à la DropDownList
sans effacer les anciennes. Sinon, le DropDownList
est effacée avant le prochain DataBind
. Doc MSDN AppendDataBoundItems (en anglais)
Il y a essentiellement deux options couvertes par la plupart des réponses :
1. Définissez une option vide en html et ajoutez les ListItems de la base de données à la DropDownList une seule fois.
Remarquez 3 choses ici :
- vierge
ListItem
est défini en html
AppendDataBoundItems="true"
-
DataBind
n'est PAS appelé lors des postbacks ou lorsque le DropDownList
article le nombre est > 1
Source :
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
Code derrière :
protected void Page_Load(object sender, System.EventArgs e)
{
if (MyList.Items.Count <= 1 ) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
Note : J'aime la logique qui consiste à vérifier le décompte par rapport à la vérification. IsPostBack
. Bien que les PostBacks soient souvent à l'origine de la duplication des liaisons de données, il est possible de les provoquer d'une autre manière. Vérifier le nombre d'éléments n'est rien d'autre que de vérifier s'ils ont déjà été chargés.
OR (possibilité d'utiliser IsPostBack
à la place)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2. Effacez et rechargez la liste déroulante à chaque rafraîchissement de la page.
Notez 3 différences par rapport à la première option :
-
AppendDataBoundItems="false"
(si elle n'est pas définie, alors false
est qu'il est valeur par défaut)
- vierge
ListItem
est ajouté dans le code derrière. Nous ne pouvons pas le définir en html car avec AppendDataBoundItems="false"
il serait nettoyé.
-
DataBind
est appelé sur chaque Page_Load
Source :
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
Code derrière :
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 -", ""));
}