37 votes

DropDownList AppendDataBoundItems (le premier élément doit être vide et sans doublon)

J'ai un DropDownList à l'intérieur d'un UpdatePanel qui est remplie lors du retour de l'utilisateur à partir d'un SqlDataSource . Il a un paramètre qui est un autre contrôle. J'ai parfois besoin de plusieurs retours en arrière, mais ce qui se passe, c'est qu'à chaque fois que le panneau de mise à jour est actualisé, des éléments sont ajoutés à l'objet DropDownList . Ainsi, le DropDownList se retrouve avec des données incorrectes, ou des données répétées.

J'ai le AppendDataBoundItems la propriété est réglée sur true parce que j'ai besoin que le premier élément soit vide.

Comment puis-je surmonter ce problème ? Existe-t-il un autre moyen d'obtenir un premier élément vide ?

(Cette DropDownList est dans une application web ASP.NET 2.0, et le code est en C#).

65voto

Keltex Points 17151

Au lieu d'utiliser AppendDataboundItems='true' (ce qui provoquera le problème dont vous parlez), répondre à la DataBound pour l'événement DropDownList puis ajoutez votre élément "vierge" en haut de la liste.

<asp:DropDownList runat="server" ID="MyList"
  ondatabound="MyListDataBound"></asp:DropDownList>

Puis dans votre code derrière :

protected void MyListDataBound(object sender, EventArgs e)
{
    MyList.Items.Insert(0, new ListItem("- Select -", ""));
}

0 votes

Suis-je la seule personne à avoir un problème avec OnDataBound pour trouver la méthode que vous avez déclaré utiliser ? Il ne semble pas chercher dans la partie arrière du code (malgré le fait que toute la DropDownList soit remplie et créée à cet endroit).

0 votes

@Keltex : Je me demande pourquoi, mais cela n'a pas fonctionné pour moi aussi. En débogage, il ne touche pas du tout l'événement.

0 votes

Désolé mais dans chaque post back ma dropdownlist ne montre pas la chaîne "select" et dans le debug elle n'entre pas dans l'événement databound. comment puis-je résoudre cela ?

6voto

Tony Points 23

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 -", ""));
}

4voto

gius Points 4298

Vous avez probablement lié cette DropDownList dans le code derrière. Vous ne devez donc pas le faire après le postback :

// probably in Page_Load method
if (!Page.IsPostBack)
{
    // do data binding here
};

3voto

Terminator Points 21

Voici une idée, nous pouvons utiliser 2 événements : DataBound y 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();
}

1 votes

Effacer la liste dans la fonction MyListDataBinding revient à définir AppendDataBoundItems="false".

0voto

Le code fonctionne, essayez de lui donner une valeur :

MyList.Items.Insert(0, new ListItem("- Select -", "0"));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X