web-dev-qa-db-fra.com

DropDownList AppendDataBoundItems (premier élément à être vierge et non dupliqué)

J'ai une DropDownList dans une UpdatePanel qui est renseignée sur la publication à partir d'une SqlDataSource. Il a un paramètre qui est un autre contrôle. J'ai parfois besoin de plusieurs publications, mais ce qui se passe, c'est que chaque fois que le panneau de mise à jour est actualisé, des éléments sont ajoutés à la DropDownList. Donc, la DropDownList finit par avoir des données incorrectes ou répétées.

La propriété AppendDataBoundItems est définie sur true car j'ai besoin que le premier élément soit vide. 

Comment puis-je surmonter ce problème? Y a-t-il un autre moyen d'avoir un premier article vierge?

(Cette DropDownList est dans une application Web asp.net-2.0 et codebehind est en c #)

Je vous remercie.

35
zohair

Au lieu d'utiliser AppendDataboundItems='true' (ce qui causera le problème dont vous parlez), répondez à l'événement DataBound pour la DropDownList, puis ajoutez votre élément "vide" 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 -", ""));
}
61
Keltex

Il ya de bonnes réponses ici mais j’ai ressenti le besoin d’inclure plus d’informations car il existe de nombreuses options qui fonctionnent et nous devons décider laquelle utiliser.

Premièrement, nous devrions comprendre AppendDataBoundItems. Si AppendDataBoundItems = "true", ListItems sont ajoutés à la DropDownList sans effacer les anciens. Sinon, la DropDownList est effacée avant la prochaine DataBind. Document MSDN AppendDataBoundItems

Il existe essentiellement 2 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 à DropDownList une seule fois.

Remarquez 3 choses ici:

  • ListItem vierge est défini en html
  • AppendDataBoundItems="true"
  • DataBind n'est PAS appelé sur les publications ou lorsque le DropDownList item count est> 1

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

Remarque: J'aime la logique de vérification du nombre vs vérification IsPostBack. Bien que les PostBack soient souvent la cause de la liaison de données en double, il est possible de la provoquer autrement. Vérifier le nombre d'éléments consiste simplement à vérifier s'il a déjà été chargé.

OU (option 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 actualisation de la page.

Remarquez 3 différences par rapport à la première option:

  • AppendDataBoundItems="false" (s'il n'est pas défini, alors false correspond à valeur par défaut)
  • ListItem est vide est ajouté dans le code derrière. Nous ne pouvons pas le définir en HTML Car avec AppendDataBoundItems="false", il serait effacé. 
  • DataBind est appelé à chaque Page_Load

La 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 -", ""));
}
4
Tony L.

Vous avez probablement lié cette DropDownList dans le code derrière. Donc, vous ne devriez pas le faire après la publication:

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

Voici une idée, nous pouvons utiliser 2 événements: DataBound et 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();
}
2
Terminator
<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server"
  DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state">
    <asp:ListItem Text="(Select a State)" Value="" />
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
  ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"
  SelectCommand="SELECT DISTINCT [state] FROM [authors]">
</asp:SqlDataSource>
1
bagher

Voici une idée.

Il y a une propriété dans la liste déroulante appelée AutoPostBack, définissez-la sur true, puis dans le code situé derrière, vous mettez toute la méthode de liaison dans la if(!Page.IsPostBack). Cela a fonctionné pour moi.

cordialement.

0
Miguel

Le code fonctionne, essayez de lui donner une valeur:

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

Ajoutez simplement EnableViewState = "false" à la balise Dropdown

<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource" 
DataTextField="Name" DataValueField="ID" EnableViewState="false" 
AppendDataBoundItems="true">
    <asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>
0
Mahmoud Nashaat