Recupérer des données dans un gridview

Résolu
lylyboop Messages postés 19 Date d'inscription mardi 6 janvier 2009 Statut Membre Dernière intervention 27 mai 2009 - 8 janv. 2009 à 11:29
lylyboop Messages postés 19 Date d'inscription mardi 6 janvier 2009 Statut Membre Dernière intervention 27 mai 2009 - 12 janv. 2009 à 15:39
Bonjour,

Je travail sur un projet ASP.net, dans ma dernière colonne de mon gridview il y a un lien reçevant en paramètre les données de deux autres colonnes. Pour chaque ligne donc le lien change.
Comment dois-je faire pour récupérer ces données ?

Merci d'avance.

9 réponses

ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
11 janv. 2009 à 02:22
Bonsoir,

Tu peux récupérer tes données sur l'événement rowdatabound, puis définir l'hyperlink.
Cela dépend en partie de la manière dont les données sont entrées dans ton gridview. Dans l'exemple ci-dessous, l'hyperlink est dans un templatefield, la récupération des cellules étant bien entendu à adapter à ton cas  :
(nb. j'ai supposé que tu passais tes données dans un querystring...)
 
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
        If e.Row.RowType = DataControlRowType.DataRow Then
            Dim o As String = e.Row.Cells(1).Text
            Dim a As String = e.Row.Cells(2).Text
            Dim h As HyperLink = CType(e.Row.FindControl("Hyperlink1"), HyperLink)
            h.NavigateUrl = "tonlien.aspx?toto=" & o & "&kiki=" & a
        End If
    End Sub

GGtry
3
annitwi Messages postés 10 Date d'inscription vendredi 9 janvier 2009 Statut Membre Dernière intervention 26 août 2010
12 janv. 2009 à 09:42
Bonjour,

Merci beaucoup pour ton aide elle m'a beaucoup aidée !
Je travail en c# et mes données du gridview sont passées en procédures stockées !
J'ai donc procédé à la récupération de mes données par la procédure stockées.
Mais j'ai un autre soucis ... je n'arrive pas à définir que mon type de colonne doit-être un buttonfield !
Pourrais-tu m'aider ? ou quelqu'un d'autre?

Merci d'avance !
0
lylyboop Messages postés 19 Date d'inscription mardi 6 janvier 2009 Statut Membre Dernière intervention 27 mai 2009
12 janv. 2009 à 10:17
Bonjour ggtry,

Merci beaucoup pour ta réponse !
Mais comme annitwi je travail en c# et j'ai moi aussi récupéré mes données par procédures stockées !
Et je me retrouve avec le même problème de définition du type de colonne voilà un bout de code en espérant que tu pourras m'aider :

if (dts_evt.Tables[0].Columns[i].ToString() == "lien")
        {
            //définition du type de colonne buttonfield
        }
        else
        {
            if (dts_evt.Tables[0].Columns[i].ToString() == "im")
            {
                //définition du type de colonne buttonfield
            }
        }

merci pour l'aide !
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
12 janv. 2009 à 11:31
Bonjour,

Je ne suis pas sûr de comprendre ce que vous voulez faire.
Vous voulez un buttonfield, et pas un hyperlink dans un templatefield ?
Pour récupérer le contrôle d'un buttonfield défini à link, vous pouvez faire (désolé, je ne code pas en c# et je donne un code vb pour ne pas faire d'erreur de syntaxe, mais ce doit être en principe facile à traduire) :
Dim c As LinkButton = e.Row.Cells(x).Controls(0) (où x est égal au numéro de cellule).
S'il s'agissait d'un hyperlinkfield, il suffirait donc de faire, par exemple :
Dim b As HyperLink = e.Row.Cells(5).Controls(0)
b.NavigateUrl = "tonlien.aspx?toto=" & o & "&kiki=" & a
Mais avec un buttonfield, cela n'est pas possible. Une solution (s'il ne s'agit que de naviguer) est de passer le lien ou le paramètre dans le commandargument du button, dans le même événement rowdatabound, en donnant un commandname quelconque pour différencier, puis de lancer la page sur l'événement rowcommand.
1/ Sur le rowdatabound :

 Dim c As LinkButton = e.Row.Cells(5).Controls(0)
            c.CommandArgument = "tonlien.aspx?toto=" & o & "&kiki=" & a
            c.CommandName = "envoyer"

2/ Et sur l'événement rowcommand :

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs)
        If e.CommandName = "envoyer" Then
            Response.Redirect(e.CommandArgument)
        End If
    End Sub

GGtry
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lylyboop Messages postés 19 Date d'inscription mardi 6 janvier 2009 Statut Membre Dernière intervention 27 mai 2009
12 janv. 2009 à 11:43
Re bonjour,

en fait je penser qu'avec un buttonfield je pouvez me rediriger vers une autre page ...
En tout cas merci beaucoup de prendre la peine de me répondre !
En fait dans mon code je fait une boucle pour créer mes colonnes :
for (i = 0; i < dts_evt.Tables[0].Columns.Count; i++)
      {
        //boucle pour ajouter explicitement chaque colonne du gridview sinon la propriete Columns.Count du gridView n'est pas mise a jour !!!
        BoundField bnd_Colonne = new BoundField();
        ...

Et c'est dans cette boucle que je souhaite ajouter un test pour savoir que si la colonne = "machin"
alors je définit cette colonne comme hyperlink mais c'est là que ça coince coté asp je sais la définir mais je dois le faire en c#. J'espère avoir été assez clair dans mon explication ...
Est-ce que tu serais comment faire ?

Lylyboop
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
12 janv. 2009 à 13:25
Rebonjour,

Je ne suis pas sûr de tout comprendre, parce que c'est toujours le même principe que pour un boundfield, par exemple (en vb) :
       Dim h As New HyperLinkField
        h.Text = "Lien"
        h.HeaderText = "Mon lien"
             ... autres propriétés...
        GridView1.Columns.Add(h)

Tu peux faire ça sur l'init de ta gridview. Pour définir ton navigateurl, tu peux le faire plutôt sur le rowdatabound.

(Pour le buttonfield : je ne crois pas qu'il y ait un accès à la propriété postbackurl du button dans ce cas. En tout cas, un button sert typiquement à faire un postback, pas à naviguer directement. Tu peux essayer de passer par un templatefield avec un button dedans).

GGtry
0
lylyboop Messages postés 19 Date d'inscription mardi 6 janvier 2009 Statut Membre Dernière intervention 27 mai 2009
12 janv. 2009 à 13:46
Voici mon code en entier :

      int i = 0;
      for (i = 0; i < dts_evt.Tables[0].Columns.Count; i++)
      {
        //boucle pour ajouter explicitement chaque colonne du gridview
        //sinon la propriete Columns.Count du gridView n'est pas mise a jour !!!
        BoundField bnd_Colonne = new BoundField();
        bnd_Colonne.HeaderText = dts_evt.Tables[0].Columns[i].ColumnName;
        bnd_Colonne.DataField = dts_evt.Tables[0].Columns[i].ColumnName;
        if (dts_evt.Tables[0].Columns[i].ToString() == "lien")
        {
                       
        }
      
        //et enfin ajout de ma nouvelle colonne
        grdEvt.Columns.Add(bnd_Colonne);
        grdEvt.Columns[i].SortExpression = bnd_Colonne.DataField;

En gros de 0 a dts_evt.Tables[0].Columns.Count j'ajoute des colonnes a mon gridview dont leur en-tête et données sont passés par procédures stockés ! Donc elles sont toutes de type Boundfield.
Sauf qu'il y en a une qui s'appelle "lien" et je veux quelle devienne de type hyperlink !

Donc dans mon code si je fais :
                    ButtonField colonne = new ButtonField();
                    colonne.Text = "lien";
                    ...
                    grdevt.Columns.add(colonne)
Cela me crée une nouvelle colonne alors que je veux modifié le type d'une colonne déjà existante !
Tu peux m'aider?
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
12 janv. 2009 à 14:42
Mais rien ne t'oblige à créer une colonne boundfield pour ton lien... Tu veux d'abord créer un boundfield, puis changer ce boundfield en buttonfield ou en hyperlinkfield : mais il suffit de créer directement ta colonne comme buttonfield ou hyperlinkfield. "Boundfield" signifie simplement que tu crées un champ de texte, et voilà tout. Or, à la place, tu peux très bien créer un buttonfield, sans créer de boundfield pour la colonne en question.
Tu mets ton test if après ta déclaration de colonne boundfield : tu devrais plutôt faire un test qui va vérifier le type de la colonne à créer. Si c'est une colonne qui doit être rendue par un boundfield, tu déclares et tu ajoutes un boundfield, sinon tu ajoutes un buttonfield... ou l'inverse.

if ( ... ton test ...)
{
BoundField bnd_Colonne = new BoundField()
bnd.colonne.headertext= etc.
...
grdEvt.Columns.Add(bnd_Colonne);
}
else
{
ButtonField bnd_Colonne = new ButtonField()
... etc ...
grdEvt.Columns.Add(bnd_Colonne);
}

GGtry
0
lylyboop Messages postés 19 Date d'inscription mardi 6 janvier 2009 Statut Membre Dernière intervention 27 mai 2009
12 janv. 2009 à 15:39
Merci beaucoup pour ton aide !
Je n'arrivait pas en fait à créer la colonne avec tes explications et récupérer les données de la procédure stockée mais c'est bon maintenant tout marche.
Encore merci à toi

@+
Lylyboop
0
Rejoignez-nous