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.
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 -", ""));
}
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 htmlAppendDataBoundItems="true"
DataBind
n'est PAS appelé sur les publications ou lorsque le DropDownList
item count est> 1La 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 -", ""));
}
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
};
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();
}
<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>
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.
Le code fonctionne, essayez de lui donner une valeur:
MyList.Items.Insert(0, new ListItem("- Select -", "0"));
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>