2009-04-08 12 views
35

J'ai un DropDownList dans un UpdatePanel qui est rempli en postback à partir d'un SqlDataSource. Il a un paramètre qui est un autre contrôle. J'ai parfois besoin de plusieurs publications, mais à chaque fois que le panneau de mise à jour est actualisé, les éléments sont ajoutés au DropDownList. Ainsi, le DropDownList finit par avoir des données incorrectes ou des données répétées.DropDownList AppendDataBoundItems (premier élément à être vide et aucun doublon)

La propriété AppendDataBoundItems est définie sur true car le premier élément doit être vide.

Comment puis-je résoudre ce problème? Y a-t-il un autre moyen d'avoir un premier objet vide?

(Ce DropDownList est dans une application web asp.net 2.0 et codebehind est en C#)

Merci.

Répondre

61

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> 

Puis dans votre code derrière:

protected void MyListDataBound(object sender, EventArgs e) 
{ 
    MyList.Items.Insert(0, new ListItem("- Select -", "")); 
} 
+0

Merci .. !! Il a aidé – msbyuva

+0

Thnx! fonctionne comme un charme – matskn

+0

Suis-je la seule personne a un problème avec OnDataBound trouver la méthode que vous l'avez déclaré à utiliser? Il ne semble pas regarder dans la fin arrière du code (Malgré le fait que l'ensemble DropDownList est peuplé et créé là.) –

0

Le code fonctionne, essayez de donner une valeur:

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

Vous lient 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 
}; 
1
<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> 
0

est ici une idée.

Il y a une propriété dans la liste déroulante appelée AutoPostBack le définir à vrai, puis dans le code derrière vous mettez toute la méthode de liaison à l'intérieur du if(!Page.IsPostBack). Cela a fonctionné pour moi.

ce qui concerne.

2

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

La suppression de la liste dans la fonction MyListDataBinding équivaut à la définition de AppendDataBoundItems = "false". –

3

Il y a de bonnes réponses ici, mais je ressentais le besoin d'inclure plus d'informations, car il y a plusieurs options travailler et nous devons décider lequel utiliser. D'abord, nous devrions comprendre AppendDataBoundItems. Si AppendDataBoundItems = "true", ListItems sont ajoutés au DropDownList sans effacer les anciens. Sinon, le DropDownList est effacé avant le prochain 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.

Avis 3 choses ici:

  • Blank ListItem est défini dans HTML
  • AppendDataBoundItems="true"
  • DataBind est pas appelé sur postbacks ou lorsque le nombre DropDownList élément est> 1

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

Note: J'aime la logique de vérifier le décompte vs vérification IsPostBack. Bien que PostBacks soit souvent la cause d'une liaison de données en double, il est possible de le provoquer d'autres manières. La vérification du nombre d'éléments consiste simplement à vérifier si elle a déjà été chargée.

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

3 avis différences de la première option:

  • AppendDataBoundItems="false" (si elle n'est pas défini alors false est c'est valeur par défaut)
  • Blank est ListItem 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

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 -", "")); 
} 
0

Just Add 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>