web-dev-qa-db-fra.com

SelectedValue qui n'est pas valide car il n'existe pas dans la liste des éléments

Je rencontre ce problème à plusieurs reprises et je n'ai aucune idée de ce qui le cause. Je reçois une exception dans le DataBind: SelectedValue which is invalid because it does not exist in the list of items.

Voici quelques informations importantes:

  1. Je recharge périodiquement listOrgs lorsque les données sous-jacentes ont changé. 
  2. L'appel Organization.DTListAll renvoie 2 paires Int, String.
  3. Il n'y a pas de valeurs dupliquées ou nulles dans les données retournées
  4. Après les deux premières lignes ci-dessous, listOrgs.Items.Count vaut 0 et la valeur sélectionnée est 0.
  5. La valeur sélectionnée après l'exécution de l'opération DataBind est la valeur de l'ID de la première ligne de la base de données.
  6. Cette exception survient la toute première fois que ce code est exécuté après un nouveau chargement de page.
listOrgs.Items.Clear(); 
listOrgs.SelectedValue = "0"; 
listOrgs.DataSource = new Organization().DTListAll(SiteID); 
listOrgs.DataTextField = "OrganizationName"; 
listOrgs.DataValueField = "OrganizationID"; 
listOrgs.DataBind();
30
Bob Jones

Apparemment, la solution que j'ai publiée n'était pas totalement efficace ... Finalement, dans mon application, j'ai changé pour ceci:

listOrgs.Items.Clear();
listOrgs.SelectedIndex = -1;
listOrgs.SelectedValue = null;
listOrgs.ClearSelection();     // Clears the selection to avoid the exception (only one of these should be enough but in my application I needed all..)
listOrgs.DataSource = new Organization().DTListAll(SiteID);
listOrgs.DataTextField = "OrganizationName"; 
listOrgs.DataValueField = "OrganizationID"; 
listOrgs.DataBind();
58
PMarques

J'ai continué à avoir cette erreur.
Ce qui est étrange, c'est qu'avant de définir la source de données et de relier après la suppression d'un élément, l'index sélectionné = -1.

Si je règle explicitement le selectedIndex = -1;, alors cela fonctionne et ne génère pas d'erreur.

Donc, même s'il était déjà -1, le mettre à -1 l'empêche de se tromper.

Bizarre hein?

7
DazManCat

Essayez de définir listOrgs.SelectedValue = "0" après avoir actualisé la DataSource

Au moment où vous essayez de sélectionner le premier élément d'une liste vide.

3
ChrisF

Je ne suis pas sûr que ce soit votre cas, mais j'avais le même problème et apparemment, il n'y avait pas d'explication. J'ai ensuite réalisé un copier-coller sur le bloc-notes d'un champ de la base de données qui, au début de la valeur, contenait une valeur NULL. 

Ce qui est curieux, c’est qu’une sélection de tables de jonction fonctionnait. J'ai supprimé la ligne et réinséré, après fonctionnait bien. 

1
Alex

Si vous avez toujours ce problème, voici comment je l'ai résolu:

listOrgs.SelectedIndex = -1;    // Clears the SelectedIndex to avoid the exception
listOrgs.DataSource = new Organization().DTListAll(SiteID);
listOrgs.DataTextField = "OrganizationName"; 
listOrgs.DataValueField = "OrganizationID"; 
listOrgs.DataBind();            //Unless you have "listOrgs.AppendDataBoundItems = true" you don't need to clear the list
1
PMarques

@PMarques answer m'a aidé et a résolu mon problème.

Cependant, tout en expérimentant, j'ai compris pourquoi je devais commettre l'erreur en premier lieu.

J'étais en train de définir l'attribut "Text" en pensant qu'il pourrait créer une étiquette englobante ou un jeu de champs + une légende (ce qui n'est pas le cas).

La propriété Text pour une liste englobe la propriété SelectedValue d'un ListControl.

Donc, mon erreur en interprétant mal ce que la propriété de texte a fait.

1
Alex KeySmith

Changer les deux premières lignes avec ceci: 

listOrgs.SelectedItem.Selected = false; 
listOrgs.Items.Clear(); 
0
Canavar

J'obtenais la même erreur à plusieurs reprises et j'essaie de finir en définissant la valeur sélectionnée par défaut sur Index -1.

J'ai commenté mon code ddlDRIBidAmt.SelectedValue = -1

Cette valeur a été définie au moment où mes contrôles de page ont été réinitialisés aux valeurs par défaut. 

0
Anjali

Je sais qu'il est trop tard pour répondre, mais ce que j'ai essayé est une solution sale, mais cela a fonctionné . Après la liaison de données, je suis insérer un élément à l'index 0

ddl.Items.Insert(0, new ListItem("---Select---","-1"));

Et au réglage,

Je suis en train d'essayer de prendre, Dans la capture je suis valeur à -1

0
user240141