7
votes

Comment lier Dropdownlist dans GridView avec les données non à partir de GridView

La moitié de la bataille d'obtenir une réponse est de savoir comment poser la question. Je ne suis pas certain que je fais un bon travail, mais c'est mon meilleur coup.

J'essaie de lier un DDL avec des données à l'intérieur d'une grille qui ne vient pas de la grille elle-même. Ceci est dans la sortie EdiTemTemplate. Le but de le faire est de donner à l'utilisateur, de démarrer, d'une valeur sélectionnée et d'une série d'autres valeurs à partir d'une procédure stockée de recherche. P>

Je vais mentionner ici que je l'ai fait avec succès avant, mais en utilisant un objetDataSource. J'essaie d'éviter cela cette fois et de le faire entièrement du code derrière pour l'instant, déplacez-le ensuite à une couche de données plus tard. P>

Voici ce que j'ai jusqu'à présent ... p> xxx pré>

... p> xxx pré>

.... p> xxx pré>

.... p> xxx pré>

Je comprende les deux derniers, ainsi que d'autres approches que je 'J'ai essayé et échoué. P>

... P>

    Protected Sub usersGrid_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowState = DataControlRowState.Edit Then
        Dim ddl As DropDownList = DirectCast(e.Row.FindControl("ddl_GetLists"), DropDownList)

        Dim conn As New SqlConnection(connectionString)
        Dim ad As New SqlDataAdapter("MAINT_DIST_GET_LISTS", conn)
        Dim ds As New DataSet()
        ad.Fill(ds)

        ddl.DataSource = ds
        ddl.DataBind()
    End If
End Sub

Public Function BindDropdown() As DataSet
    Dim conn As New SqlConnection(connectionString)
    Dim ad As New SqlDataAdapter("MAINT_DIST_GET_LISTS", conn)
    Dim ds As New DataSet()
    ad.Fill(ds)

    ddl_GetLists.DataSource = ds
    ddl_GetLists.DataBind()
End Function


0 commentaires

4 Réponses :


12
votes

Vous avez quelques options. Vous pouvez utiliser un contrôle de DataSource ou vous pouvez lier les fichiers déroulants dans le code-code dans l'événement code> rowdatabound code> de la grilleview.

J'ai remarqué deux problèmes dans votre code aussi. Dans votre exemple, vous affectez le code> DataSourceid code> de manière incorrecte. Le datasourceid code> doit pointer sur l'ID d'un contrôle de données de DataSource sur la page: p> xxx pré>

Si vous voulez faire la liaison dans le code-Code-derrière, vous peut faire cela via le Rowdatabound CODE> Event: P>

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow AndAlso (e.Row.RowState And DataControlRowState.Edit) = DataControlRowState.Edit Then
        Dim ddl As DropDownList = TryCast(e.Row.FindControl("ddl_GetLists"), DropDownList)
        If ddl IsNot Nothing Then
            ddl.DataSource = RetrieveDataSource()
            ddl.DataBind()
        End If
    End If
End Sub


5 commentaires

J'ai fait avec succès quelque chose de similaire à celui-ci en utilisant un objetDataSource dans le passé, mais j'essaie de le faire exclusivement du code derrière cette heure. Est-ce possible?


Concernant la propriété Connectionstrings. L'application que j'ai été affectée à ajouter utilise une clé dans Appsettings au lieu de l'attribut Normal ConnectionsRing du fichier de configuration. Existe-t-il un moyen de l'appeler de Sqldatasource?


@Johnkinane: Je pense que vous pouvez toujours lier onRowdatabound . J'ai édité ma réponse pour lier la liste déroulante si la ligne est en mode édition.


Oui. Son objectif est de permettre à l'utilisateur de sélectionner différentes options à partir d'une recherche SP.


@Jamesjohnson: Je suis confronté au même problème, je ne peux pas obtenir les valeurs de la liste déroulante qui se trouve à l'intérieur de la grille. Et j'ai besoin du même code VB en C #. Aidez-moi, s'il vous plaît



0
votes

Je vois quelques problèmes.

Protected Sub usersGrid_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs)
    usersGrid.EditIndex = e.NewEditIndex
    BindData()

End Sub


2 commentaires

La deuxième partie de votre réponse est incorrecte. Il ne devrait pas y avoir de problème de trouver le contrôle à l'aide de cet identifiant.


Je dois noter que lors de l'utilisation de VS 2010 que le contrôle DDL, tandis que dans le réseau GridView est "non" visible "à l'application, mais lorsque je le sors de la grille, il" est ". Je n'ai aucune explication à cela.



1
votes

Vous pouvez simplement créer une liste globale de type que vous souhaitez et le définir comme null Si vous utilisez LINQ, mettez simplement cette source dans le DropdownListObject.DataSource xxx

espoir qu'il sera utile.


0 commentaires

0
votes

Vous fixez ceci:

  1. Dans la page Code, vous définissez une fonction publique getListData () (je pense que vous avez fait). p> li>

  2. Utilisez la propriété DataSource (si vous souhaitez appeler une fonction): p>

                <asp:DropDownList ID="ddl_GetLists" 
                                  DataSource='<%# GetListData() %>'
                                  AppendDataBoundItems="true"
                                  DataValueField="listID"
                                  DataTextField="listName"
                                  SelectedValue='<%#Bind("listID") %>'
                                  runat="server" >
                </asp:DropDownList>
    


1 commentaires

Merci pour votre réponse. Vous pouvez mettre des chevreakes dans votre contenu si vous laissez 2 espaces à la fin de la ligne. Cela rend la réponse plus claire.