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 #)

Était-ce utile?

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 de DropDownList 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 alors false 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'avec AppendDataBoundItems="false", il serait vidé.
  • DataBind est appelé à chaque Page_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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top