web-dev-qa-db-fra.com

Comment effacer les éléments de la liste déroulante existants lorsque son contenu change?

ddl2 se remplit correctement en fonction de la valeur sélectionnée ddl1.

Mon problème est que les données qui sont déjà présentes dans ddl2 ne sont pas effacées avant d'ajouter les nouvelles données, le contenu ddl2 continue donc de croître à chaque fois que ddl1 est modifié.

<asp:DropDownList ID="ddl1" RunAt="Server" DataSourceID="sql1" DataValueField="ID1" DataTextField="Name2" AppendDataBoundItems="True" AutoPostBack="True">
  <asp:ListItem Text="ALL" Selected="True" Value="0"/>
</asp:DropDownList>

<asp:DropDownList ID="ddl2" RunAt="Server" DataSourceID="sql2" DataValueField="ID2" DataTextField="Name2" AppendDataBoundItems="True" AutoPostBack="True">
  <asp:ListItem Text="ALL" Selected="True" Value="0"/>
</asp:DropDownList>

<asp:SqlDataSource ID="sql1" RunAt="Server" SelectCommand="sp1" SelectCommandType="StoredProcedure"/>

<asp:SqlDataSource ID="sql2" RunAt="Server" SelectCommand="sp2" SelectCommandType="StoredProcedure">
  <SelectParameters>
    <asp:ControlParameter Type="Int32" Name="ID1" ControlID="ddl1" PropertyName="SelectedValue"/>
  </SelectParameters>
</asp:SqlDataSource>

J'ai essayé de re-databinding dans le code derrière sur le changement d'index sélectionné et aussi items.clear avec peu de succès.

Protected Sub ddl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
    ddl2.Items.Clear()
    ddl2.DataSource = sql2
    ddl2.DataBind()
End Sub

QUESTION

Comment obtenir des éléments présents dans une liste déroulante asp: à effacer avant que de nouvelles valeurs ne soient remplies lorsque le contenu des listes déroulantes dépend d'une autre valeur sélectionnée des listes déroulantes?

Veuillez poster n'importe quel code en VB

10
DreamTeK

L'utilisation de ddl.Items.Clear() effacera la liste déroulante mais vous devez être sûr que votre liste déroulante est pas définie sur:

AppendDataBoundItems="True"

Cette option entraînera l'ajout des données de rebond à la liste existante qui ET NON sera effacée avant la liaison.

SOLUTION

Ajouter AppendDataBoundItems="False" à votre liste déroulante.

Désormais, lorsque les données sont rebondies, elles effacent automatiquement toutes les données existantes au préalable.

Protected Sub ddl1_SelectedIndexChanged(sender As Object, e As EventArgs)
    ddl2.DataSource = sql2
    ddl2.DataBind()
End Sub

REMARQUE: Cela peut ne pas convenir dans toutes les situations car les éléments appenddatbound peuvent amener votre liste déroulante à ajouter ses propres données à chaque changement de la liste.


CONSEIL SUPÉRIEUR

Vous souhaitez toujours ajouter un élément de liste par défaut à votre liste déroulante, mais vous devez relier les données?

Utilisation AppendDataBoundItems="False" pour éviter la duplication des données lors de la publication, puis directement après avoir lié votre liste déroulante, insérez un nouvel élément de liste par défaut.

ddl.Items.Insert(0, New ListItem("Select ...", ""))
21
DreamTeK

Vous devez vider votre listbbox avant la liaison:

 Me.ddl2.Items.Clear()
  ' now set datasource and bind
9
jason

Veuillez utiliser ce qui suit

ddlCity.Items.Clear();
5
Sheryar Nizar

2 étapes simples pour résoudre votre problème

Tout d'abord, vérifiez la propriété AppendDataBoundItems et faites-lui affecter false

Ensuite, effacez tous les éléments en utilisant la propriété .clear ()

{
ddl1.Items.Clear();
ddl1.datasource = sql1;
ddl1.DataBind();
}
2
Moin Shirazi

vient de compiler votre code et la seule chose qui manque, c'est que vous devez lier votre ddl2 à une source de données vide avant de le lier à nouveau comme ceci:

Sub protégé ddl1_SelectedIndexChanged (expéditeur ByVal As Object, ByVal e As EventArgs) //ddl2.Items.Clear ()

ddl2.DataSource=New List(Of String)()
ddl2.DataSource = sql2
ddl2.DataBind() End Sub

et cela a très bien fonctionné

1
Adam