DropDownList AppendDataBoundItems (premier élément à vide et pas de doublons)
-
06-09-2019 - |
Question
I ai DropDownList
l'intérieur d'un UpdatePanel
qui est rempli lors de la publication d'un SqlDataSource
. Il a un paramètre qui est un autre contrôle. Je dois parfois plusieurs postbacks, mais ce qui se passe est que chaque fois que le panneau de mise à jour actualise, les éléments sont ajoutés à la DropDownList
. Ainsi, le DropDownList
finit par avoir des données qui sont incorrectes ou des données répétées.
J'ai la propriété AppendDataBoundItems
mis à true
parce que je dois le premier élément à être vide.
Comment puis-je résoudre ce problème? Y at-il une autre façon d'avoir un premier élément vide?
(Cette DropDownList
est dans une application Web ASP.NET 2.0, et codebehind est en C #)
La solution
Au lieu d'utiliser AppendDataboundItems='true'
(ce qui entraînera le problème que vous parlez), répondre à l'événement DataBound
pour la DropDownList
et ajoutez votre article « vide » en haut de la liste.
<asp:DropDownList runat="server" ID="MyList"
ondatabound="MyListDataBound"></asp:DropDownList>
Ensuite, dans votre code derrière:
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
Autres conseils
Il y a de bonnes réponses ici, mais je ressentais le besoin d'inclure plus d'informations, car il y a plusieurs options qui fonctionnent et nous devons décider d'utiliser.
Tout d'abord, nous devons comprendre AppendDataBoundItems
. Si AppendDataBoundItems = "true"
, ListItems
sont ajoutés à la DropDownList
sans effacer les anciens. Dans le cas contraire, la DropDownList
est effacée au sujet avant la prochaine DataBind
. MSDN AppendDataBoundItems doc
Il y a essentiellement 2 options couvertes par la plupart des réponses:
1. Définir une option vide en html et ajoutez les ListItems de la base de données à la DropDownList une seule fois.
Remarque 3 choses ici:
-
ListItem
Blank est défini en html -
AppendDataBoundItems="true"
-
DataBind
est pas appelé postbacks ou lorsque l'élément deDropDownList
comptage est> 1
Source:
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
Code de 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 de vérifier le décompte vs vérification IsPostBack
. Bien que postbacks sont souvent la cause de databinding double, il est possible de provoquer d'autres moyens. Vérification du nombre d'éléments est essentiellement en train de vérifier pour voir si elle a déjà été chargé.
OR (possibilité d'utiliser à la place IsPostBack
)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2. Effacer et recharger la DropDownList sur chaque rafraîchissement de la page.
Remarque 3 différences de la première option:
-
AppendDataBoundItems="false"
(si elle n'est pas défini alorsfalse
est-il est valeur par défaut) -
ListItem
Blank est est ajouté dans le code derrière. Nous ne pouvons pas le définir en html parce qu'avecAppendDataBoundItems="false"
, il serait vidé. -
DataBind
est appelé à chaquePage_Load
Source:
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
Code de 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 liez probablement que DropDownList dans le code derrière. Donc, vous ne devriez pas le faire à nouveau 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
il est défini sur true, puis dans le code derrière vous mettez toute la méthode de reliure à l'intérieur du if(!Page.IsPostBack)
. Cela a fonctionné pour moi.
concernant.
Just Add EnableViewState = "false" pour 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>