web-dev-qa-db-fra.com

a une SelectedValue qui n'est pas valide car elle n'existe pas dans la liste des éléments. Comment déboguez-vous?

J'ai des problèmes avec la liaison d'asp.net à une liste déroulante et je ne sais pas comment déboguer. J'ai vérifié les autres questions à ce sujet sur la pile, mais rien n'a aidé. Pour autant que je puisse voir le "nom", il convient de sélectionner est dans la liste.

<asp:DropDownList ID="dd1" runat="server" DataSourceID="ADataSource" DataTextField="Name" 
                                                    DataValueField="Name" SelectedValue='<%# Bind("Name") %>'   Width="255" 
                                                    AppendDataBoundItems="true" TabIndex="3"  Font-Size="small"  EnableViewState="true"    >
                                             <asp:ListItem Text="Select"  Value="" />
                                           </asp:DropDownList>

Voici l'erreur

System.ArgumentOutOfRangeException n'a pas été géré par le code utilisateur. Message = 'dd1' a une SelectedValue non valide car elle n'existe pas dans la liste des éléments. Nom du paramètre: valeur Source = System.Web NomNom = valeur StackTrace: à System.Web.UI.WebControls.ListControl.PerformDataBinding (IEnumerable dataSource) à System.Web.UI.WebControls.ListControl.OnDataBinding (EventArgs e) à System.Web .UI.WebControls.ListControl.PerformSelect () à System.Web.UI.WebControls.BaseDataBoundControl.DataBind () à System.Web.UI.Control.DataBindChildren () à System.Web.UI.Control.DataBind (Boolean raiseOnDataBinding) sur System.Web.UI.Control.DataBind () sur System.Web.UI.Control.DataBindChildren () sur System.Web.UI.Control.DataBind (Boolean raiseOnDataBinding) sur System.Web.UI.Control.DataBind () sur System.Web.UI.Control.DataBindChildren () sur System.Web.UI.Control.DataBind (Boolean raiseOnDataBinding) sur System.Web.UI.Control.DataBind () sur System.Web.UI.Control.DataBindChildren () sur System.Web.UI.Control.DataBind (Boolean raiseOnDataBinding) sur System.Web.UI.WebControls.DetailsView.CreateChildControls (IEnumerable dataSource, Boolean dataBinding) sur System.Web.UI.WebCont rols.CompositeDataBoundControl.PerformDataBinding (IEnumerable data) à System.Web.UI.WebControls.DetailsView.PerformDataBinding (IEnumerable data) à Sélectionnez (arguments DataSourceSelectArguments, rappel DataSourceViewSelectCallback) dans System.Web.UI.WebControls.DataBoundControl.PerformSelect () dans System.Web.UI.WebControls.BaseDataBoundControl.DataBind () dans System.Web.UI.WebControls.DongStore, dans at storeUpdate.GvStoresSelect_SelectedIndexChanged (Expéditeur d'objet, EventArgs e), ligne 233, à System.EventHandler.Invoke (Expéditeur d'objet, EventArgs e) à System.Web.UI.WebControls.GridView.OnSelectedIOnSelectedIndexChanged (EventArgs) à System.e. WebControls.GridView.HandleSelect (Int32 rowIndex) à System.Web.UI.WebControls.GridView.HandleEvent (EventArgs, Boolean causesValidation, String validationGroup) à System.Web.UI.WebControls.GridView.OnBubbleEvent (Source d'objet, EventArgs e) à System.Web.UI.Control.RaiseBubbleEvent (Source d'objet, Arguments EventArgs) à System.Web.UI.WebControls.GridViewRow.OnBubbleEvent (Source d'objet, EventArgs e) à System.Web.UI.Control.RaiseBubbleEvent ( Source d'objet, Arguments EventArgs) à System.Web.UI.WebControls.LinkButton.OnCommand (CommandEventArgs e) à System.Web.UI.WebControls.LinkButton.RaisePostBackEvent (String eventArgument) à System.Web.UI.WebControls.LinkButton.Systems .Web.UI.IPostBackEventHandler.RaisePostBackEvent (String eventArgument) sur System.Web.UI.Page.RaisePostBackEvent (IPostBackEventHandler sourceControl, String eventArgument) sur System.Web.UI.Page.RagePostBackEdit (NomValiste) Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) InnerException:

6
chobo2

La valeur provenant de <%# Bind("Name") %>, transmise à la propriété SelectedValue, ne correspond à aucun élément de sa collection. Causes les plus probables:

  • DropDownList ne contient aucun élément car l'évaluation est effectuée avant que la liste ne soit liée
  • La liste est liée mais il manque cette valeur particulière
  • La valeur renvoyée pourrait être null
6
Brian Mains

Je me rends compte que c'est un vieux fil de discussion, mais Google l'a présenté comme la première option pour résoudre ce problème - avec un terme de recherche assez générique. 

Quoi qu'il en soit, les problèmes que j'ai rencontrés avec ceci et la façon dont je l'ai résolu sont les suivants. Le problème se posera, comme l’a dit Brian Mains pour les raisons suivantes:

  • DropDownList ne contient aucun élément car l'évaluation est effectuée avant que la liste ne soit liée 
  • La liste est liée mais il manque cette valeur particulière
  • La valeur renvoyée pourrait être null

Le problème que je rencontrais, même si ce n'était pas très clair car je n'ai pas eu d'erreurs sur certains des autres DropDowns pour lesquels j'utilisais la même méthode, était que lors du chargement de la page, j'essayais d'utiliser ce code -hind pour ajouter un élément à la DropDownList:

drpNationality.Text = GlobalScript.CountDatabaseRecords("SELECT [nationality_desc] FROM [tbl_people] INNER JOIN [tbl_lkup_nationality] AS nationality ON [nationality] = [nationality_id] WHERE [person_id] ='" + Session["ID"] + "'");

Et voici le code HTML DropDown (qui contient des éléments remplis par un DataSource):

<label>Nationality:</label>
<asp:DropDownList ID="drpNationality" runat="server" DataSourceID="Nationality_Datasource" DataTextField="nationality_desc" DataValueField="nationality_id">
</asp:DropDownList>

Maintenant, le problème que je devenais était que les données n’étaient pas liées au contrôle au moment du chargement, lorsque j’essayais d’ajouter des éléments dans le code-behing. Étant donné que j'essayais de présélectionner une valeur de la base de données au démarrage de l'utilisateur (qui existait déjà dans la liste), cela ne me gênait pas trop si l'élément y figurait deux fois. 

Donc, mon travail a été le suivant.

J'ai changé le code de retard comme suit, de sorte que l'élément ait été ajouté à DropDownList lors de l'exécution du code d'événement de chargement, puis sélectionné:

var = GlobalScript.CountDatabaseRecords("SELECT [nationality] FROM [tbl_people] INNER JOIN [tbl_lkup_nationality] AS nationality ON [nationality] = [nationality_id] WHERE [person_id] ='" + Session["ID"] + "'");
drpNationality.Items.Add(var);
drpNationality.Text = var;

Mais pour que l'élément qui a été choisi dans Code-behind soit conservé une fois la page entièrement chargée et ne soit pas écrasé par le DataSource, vous devez modifier le code HTML comme suit:

<label>Nationality:</label>
<asp:DropDownList ID="drpNationality" runat="server" DataSourceID="Nationality_Datasource" DataTextField="nationality_desc" DataValueField="nationality_id" AppendDataBoundItems="True">
</asp:DropDownList>

Maintenant, lorsque la page est chargée, la valeur de la base de données devrait être présélectionnée dans la liste déroulante et tous les éléments de la source de données doivent également être ajoutés.

J'espère que cela t'aides.

3
chrismason954

DataBind pue. J'ai essayé toutes les suggestions mentionnées et aucune d'entre elles n'a fonctionné. Nous avons fini par définir SelectedValue sur null, en effaçant tous les éléments (myDDL.Items.Clear()), puis en parcourant ma liste et en ajoutant manuellement de nouveaux ListItems - myDDL.Items.Add(new ListItem(myListEntry.Text,myListEntry.Value))

3
David P

J'ai eu le même problème. Voici ce qui se passait. J'avais initialement défini la valeur sur quelque chose qui ne figurait pas dans ma liste déroulante. Si ce que vous aviez à l'origine ne fait pas partie des valeurs que vous souhaitez afficher dans la liste déroulante, cela ne fonctionnera pas. Par exemple, si vous aviez initialement Fred dans les données, vous devez avoir Fred dans cette liste déroulante.

1
Andy

Si la propriété Text de contrôles déroulants est affectée avec une valeur avant d'attribuer la source de données, cette erreur se produit.

Exemple:

StatusDropDown.Text = "some value";
StatusDropDown.DataSource = statusDatatable;

En exécutant la 2ème ligne, vous obtiendrez cette erreur.

0
Ramasubbu

J'ai rencontré un problème similaire - le problème de base était le format du champ de base de données SQL sous-jacent référencé par mon RadioButtonList. J'ai converti le champ DB de NCHAR en VARCHAR ... Je pense que NCHAR ajoute un contenu supplémentaire au champ, ce qui a généré une erreur lors de l'évaluation par le RadiolButton. Vous devrez peut-être supprimer et charger les données qui ont été insérées sous NCHAR dans VARCHAR. Cela a fonctionné pour moi .. espérons que cela fonctionne pour vous.

0
James

Dans mon cas, la méthode pour effacer la liste déroulante était initialement définie comme ddlname.text = string.empty.

Je l'ai remis à ddlname.items.clear() et ceci a résolu l'erreur.

0
user2460568