2010-12-16 3 views
0

J'ai un WebDataGrid lié à un SqlDataSource pour afficher des données. Quand une ligne est sélectionnée, je veux remplir des zones de texte et des listes déroulantes avec les données de cette ligne, à des fins d'édition. Les zones de texte fonctionnent bien; J'utilise le code suivant pour sélectionner le second champ dans la grille (date) et remplir la zone de texte correspondante (j'utilise VB):Remplir DropDownList à partir de WebDataGrid

txtDate.Text = currentRow.Items(2).Value 

Cependant, lorsque je tente de remplir les DropDownLists en utilisant la même structure de code , je reçois l'erreur suivante:

'ddlType' has a SelectedValue which is invalid because it does not exist in the list of items. 

Je pense que le problème peut être que les DropDownLists sont renseignés à l'aide type_id, alors que la grille affiche nom_type. Cela causerait-il le problème et y a-t-il un moyen de contourner le problème?

Répondre

0

Il y a quelques choses que vous pouvez essayer:

  1. Changez le SQLDataSource pour retourner le type_id aussi et Définissez la colonne sur visible = "false" de cette façon, vous pouvez sélectionner ce champ à la place du nom et l'utiliser pour .SelectedValue. Si cela n'est pas possible, vous pouvez utiliser un code comme celui-ci (cela ne fonctionnera que si le texte affiché dans le menu déroulant est unique et est exactement le même que celui affiché dans la vue de la grille):

    'replace this with the call to currentRow.Items(#).Value
    Dim sometext As String = "type_name"

    DropDownListName.Items.FindByText(sometext).Selected = True

  2. l'autre possibilité est de boucler à travers chaque élément dans la liste déroulante et trouver le texte, cela ressemble à la méthode de la force brute mais fonctionne.

    'replace this with the call to currentRow.Items(#).Value

    Dim sometext As String = "type_name"

    For Each ddItem As ListItem In ddArriveAMPM.Items

    `If String.Compare(sometext, ddItem.Text, True) = 1 Then` 
        `ddItem.Selected = True` 
        `End If`   
    `Next` 
    
+0

Je ne suis pas sûr de comprendre la deuxième option (je suis assez nouveau pour ASP.NET). le nom de type de la ligne sélectionnée sans utiliser currentRow.Items (#). Value? (Chaque élément de la liste déroulante est unique et il est le même que le nom affiché dans la grille.) – dj18

+0

Merci - J'utilise la première suggestion ! – dj18

0

Vous devez ajouter l'article à la liste avant de pouvoir le sélectionner.

DropDownListX.Items.Add("Item"); 

ou

DropDownListX.Items.Add(new ListItem("String","Value")); 

Assurez-vous d'effacer la liste déroulante lors de la sélection d'une nouvelle ligne sinon les anciennes valeurs de lignes resteront là-bas.

DropDownListX.Items.Clear(); 

Après cela, vous pouvez utiliser SelectedValue

Cheers, Stefan

+0

Maintenant, je reçois le message d'erreur suivant: « non valide postback ou un argument de rappel ... Pour des raisons de sécurité, cette fonctionnalité Vérifie que les arguments des événements de publication ou de rappel proviennent du contrôle serveur qui les a rendus à l'origine. Voir le ClientScriptManager.Méthode RegisterForEventValidation afin d'enregistrer les données de publication ou de rappel pour validation. »Et le remplissage des zones de texte a également cessé de fonctionner – dj18

+0

Par ailleurs, pour: DropDownListX.Items.Add (new ListItem (" String "," Value ")); - Est-ce que les paramètres seraient currentRow.Items (1) .Value (ou quel que soit le numéro de champ dont j'ai besoin)? – dj18

+0

Oui, peut-être bon de faire un currentRow.Items (1) .Value.ToString(). Vous pouvez le faire pour les deux les éléments de sorte que vous pouvez utiliser SelectedValue plus tard dans le code si vous n'avez pas un ID ou quelque chose pour lier la valeur – StefanE

Questions connexes