Question

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.

Le 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

Le 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 le 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?

Était-ce utile?

La solution

Commencez par définir les DropDownLists propriété de AppendDataBoundItems true. Ensuite, ajoutez la ListItem NULL en ajoutant l'élément suivant <asp:ListItem> à chaque DropDownList afin que le balisage déclaratif ressemble à:

<asp:DropDownList ID="Categories" runat="server"
    DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
    DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'
    AppendDataBoundItems="True">
    <asp:ListItem Value="">[nothing selected]</asp:ListItem>
</asp:DropDownList>

Autres conseils

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 propre (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 est lui-même lié.

Pour l'instant, donc bon.Juste quelques lignes de code supplémentaires dans le Page_Load

AppendDataBoundItems = "true"> œuvres mais pas dans tous les cas. Faire dropdownlist l'intérieur GridView est encore un mystère que Microsoft doit résoudre. Ils disent que le développement est 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.

OK, car cela est un problème commun, je suppose que sa valeur pour poster effectivement une réponse. Après beaucoup de recherche autour que j'ai trouvé deux solutions - bien, un timbre et un vrai

  1. Correctif: Réglez le AppendDataBoundItem=true de réglage DDL etun ajouter manuellement un élément à la liste (à savoir « S'il vous plaît Sélectionnez » avec la valeur null):

       S'il vous plaît Sélectionnez                             

Cela semble fonctionner dans environ 80% des cas. J'avais une situation bizarre quand je devais mettre à jour existante (et de travail) requête utilisée par DDL pour permettre une autre valeur du paramètre - requête a été quelque chose de similaire à SELECT ID, Name from EMPLOYEES where Department =@Department et à l'origine @Department ne pouvait être égal à « planificateurs » et « Atelier » - après avoir ajouté « Logistique » mystérieusement cessé de fonctionner LDD SEULEMENT pour la nouvelle valeur du service.

  1. solution appropriée: Lier le DDL au cours de l'événement GridView_RowDataBound (grâce à mouillage Cet article

Mon paramètre est considéré comme un texte de l'étiquette (mis en place un autre endroit)

    protected void GridView5_RowDataBound(object sender, GridViewRowEventArgs e)
    {

    //********** this  is a workaround for the annoying problem with dropdownlist in gidview without adding new item ************
    if (e.Row.RowType == DataControlRowType.DataRow && GridView5.EditIndex == e.Row.RowIndex)
    {
        DropDownList DropDownList5 = (DropDownList)e.Row.FindControl("DropDownList5");
        string query = "SELECT gkey as empID, name FROM [employees] where department=@department";
        SqlCommand command = new SqlCommand(query);
        command.Parameters.AddWithValue("@department", lblDepartment.Text);
        DropDownList5.DataSource = GetData(command);
        DropDownList5.DataTextField = "name";
        DropDownList5.DataValueField = "empID";
        DropDownList5.DataBind();
    }

Et la méthode GetData:

   private DataTable GetData (SqlCommand cmd)
{
    string strConnString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(strConnString))
    {
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            cmd.Connection = con;
            sda.SelectCommand = cmd;
            using (DataTable dt= new DataTable())
            {
                sda.Fill(dt);
                return dt;
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top