Recupérer des données dans un gridview [Résolu]

lylyboop 19 Messages postés mardi 6 janvier 2009Date d'inscription 27 mai 2009 Dernière intervention - 8 janv. 2009 à 11:29 - Dernière réponse : lylyboop 19 Messages postés mardi 6 janvier 2009Date d'inscription 27 mai 2009 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
ggtry 417 Messages postés vendredi 13 juin 2008Date d'inscription 21 juillet 2010 Dernière intervention - 11 janv. 2009 à 02:22
3
Merci
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

Merci ggtry 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de ggtry
annitwi 10 Messages postés vendredi 9 janvier 2009Date d'inscription 26 août 2010 Dernière intervention - 12 janv. 2009 à 09:42
0
Merci
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 !
Commenter la réponse de annitwi
lylyboop 19 Messages postés mardi 6 janvier 2009Date d'inscription 27 mai 2009 Dernière intervention - 12 janv. 2009 à 10:17
0
Merci
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 !
Commenter la réponse de lylyboop
ggtry 417 Messages postés vendredi 13 juin 2008Date d'inscription 21 juillet 2010 Dernière intervention - 12 janv. 2009 à 11:31
0
Merci
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
Commenter la réponse de ggtry
lylyboop 19 Messages postés mardi 6 janvier 2009Date d'inscription 27 mai 2009 Dernière intervention - 12 janv. 2009 à 11:43
0
Merci
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
Commenter la réponse de lylyboop
ggtry 417 Messages postés vendredi 13 juin 2008Date d'inscription 21 juillet 2010 Dernière intervention - 12 janv. 2009 à 13:25
0
Merci
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
Commenter la réponse de ggtry
lylyboop 19 Messages postés mardi 6 janvier 2009Date d'inscription 27 mai 2009 Dernière intervention - 12 janv. 2009 à 13:46
0
Merci
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?
Commenter la réponse de lylyboop
ggtry 417 Messages postés vendredi 13 juin 2008Date d'inscription 21 juillet 2010 Dernière intervention - 12 janv. 2009 à 14:42
0
Merci
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
Commenter la réponse de ggtry
lylyboop 19 Messages postés mardi 6 janvier 2009Date d'inscription 27 mai 2009 Dernière intervention - 12 janv. 2009 à 15:39
0
Merci
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
Commenter la réponse de lylyboop

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.