Erreur: SelectedValue qui n'est pas valide car il n'existe pas dans la liste des articles
J'ai un Gridview qui se lie à un ObjectDataSource (objStudentDetails). Dans éditer/modifier le mode d'insertion de la Gridview l'un des champs est un DropDownList qui arrive c'est la liste de sélection options à partir d'une table de recherche. J'ai cette DropDownList de liaison à un autre contrôle ObjectDataSource (objStateList), qui représente la table de recherche. Il fonctionne très bien aussi longtemps que la valeur de la objStudentDetails ObjectDataSource correspond à une des valeurs dans la objStateList ObjectDataSource, au moins dans le cas d'un non vide de la chaîne de valeur de toute façon.
La objStateList a ces valeurs (à partir de la procédure stockée qui le charge - ID#6 est une chaîne vide "):
StateId State
----------- -----
6
4 AL
1 GA
3 KY
2 TN
La objStudentDetails a ces valeurs (à partir de la procédure stockée qui le charge):
FirstName LastName State
----------- ---------- -----
tone smith TN
Ou il pourrait avoir cet ensemble de résultats (de l'État est une chaîne vide - "):
FirstName LastName State
----------- ---------- -----
jenny johnson
Dans la première objStudentDetails resultset l'état DropDownList dans le EditItemTemplate montre jusqu'à fin. Dans le deuxième jeu de résultats, cependant, j'ai cette erreur:
'ddlEditState' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value
Je pense que depuis mon tableau de recherche a une valeur à une chaîne vide, le objStudentDetails valeur avec une chaîne vide pour l'etat serait de match, mais quelque chose ne fonctionne pas de la façon dont je suis l'attend.
Voici mon EditItemTemplate code de la Gridview:
<EditItemTemplate>
<asp:Panel ID="panEditState" runat="server">
<asp:DropDownList ID="ddlEditState" runat="server" CssClass="GridviewDropdownlist"
DataSourceID="objStateList" DataTextField="State" DataValueField="State"
SelectedValue='<%# Bind("State") %>'
Width="50px">
</asp:DropDownList>
</asp:Panel>
</EditItemTemplate>
Et la objStateList, qui appelle une méthode passage d'un paramètre dont la table de recherche pour la requête:
<asp:ObjectDataSource ID="objStateList" runat="server" SelectMethod="GetDropdownData" TypeName="AIMLibrary.BLL.DropdownData">
<SelectParameters>
<asp:Parameter Name="itemsToGet" DefaultValue="state" />
</SelectParameters>
</asp:ObjectDataSource>
Des idées?
OriginalL'auteur Tone | 2009-08-22
Vous devez vous connecter pour publier un commentaire.
Commençons par définir les deux DropDownLists' AppendDataBoundItems true à la propriété. Ensuite, ajoutez la valeur NULL ListItem par adjonction,
<asp:ListItem>
élément à chaque DropDownList, de sorte que l'ensemble des déclarations de balisage ressemble:Je suis en utilisant le modèle de liaison pour cette réponse a été le meilleur ajustement.
OriginalL'auteur kidd
Je soupçonne qu'il y a de nombreux scénarios différents qui peut provoquer cette erreur. Dans mon cas, j'ai eu un menu déroulant placé dans un champ de modèle. La liste déroulante est lié à sa propre objectdatasource, et sa propriété selectedvalue était lié à un champ de la gridview (séparée) de la source de données.
Maintenant, avec mon scénario spécifique, le problème a été une condition de course. Le contrôle gridview de la source de données a été remplie et lié AVANT le des listes déroulantes ont eu leur tour. Cela signifiait également que les listes déroulantes' selectedvalues étaient mis en AVANT le des listes déroulantes' objets ont été créés par le biais de leurs propres liaisons.
Je suis sûr qu'il doit y avoir une meilleure solution, mais je n'ai pas beaucoup de temps pour la recherche. J'ai déconnecté la gridview et les listes déroulantes de leurs sources de données (ce qui signifie, en supprimant les assignations de l'designer) et a décidé de se lier par programmation. De cette façon, je peux lier explicitement les listes déroulantes afin que leurs éléments les valeurs seront disponibles lorsque le contrôle gridview lui-même est lié.
Donc bon. Juste quelques lignes de code supplémentaires dans le Page_Load
OriginalL'auteur Tony
AppendDataBoundItems="True"> fonctionne, mais pas dans tous les cas. Faire dropdownlist à l'intérieur GridView est encore un mystère qui Microsoft a à résoudre. Ils disent de développement de l'est de l'ASP est beaucoup plus rapide que PHP. Eh bien c'est mon troisième jour sur ce petit problème et toujours pas de solution.
OriginalL'auteur Hammad Khan
OK, puisque c'est un problème commun je suppose que cela vaut la peine de réellement répondre: Après beaucoup de recherche autour de j'ai trouvé deux solutions - eh bien, un patch et un un véritable.
Patcher:
Définir le DDL réglage
AppendDataBoundItem=true
anda ajouter manuellement un élément de la liste (c'est à dire "s'il vous Plaît Sélectionnez" avec la valeur null):< asp:DropDownList ID="DropDownList5 runat="server" AppendDataBoundItems="True" ... >
< asp:ListItem>Merci de choisir< /asp:ListItem>
< /asp:DropDownList>
Cela semble fonctionner dans environ 80% des cas. J'ai eu une drôle de situation quand j'ai eu à mettre à niveau existant (et de travail) de requête utilisé par DDL pour permettre à un autre de la valeur du paramètre de Requête a été quelque chose de semblable à
SELECT ID, Name from EMPLOYEES where Department =@Department
et à l'origine@Department
ne pouvait être égal à "Planificateurs" et "l'Atelier" - après l'ajout de "Logistique" DDL mystérieusement cessé de travailler SEULEMENT pour la nouvelle valeur de département.GridView_RowDataBound
événement (source grâce à Cet articleMon paramètre est pris comme un texte de l'étiquette (mis en place ailleurs)
Et la méthode GetData:
OriginalL'auteur Yasskier