IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Petite question concernant le GridView


Sujet :

ASP.NET

  1. #1
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut Petite question concernant le GridView
    Bonjour,

    Je vous explique : j'ai une page qui affiche un controle type Calendar. Lorsque l'utilisateur clic sur une date, en fonction de son login et de son statut enregistré en session, une DropDownList s'affiche et un GridView se remplit selon une requête. Bien sur, si l'utilisateur clic sur quelque chose dans la DropDownLis, le GridView actualise les données pour la même date.

    Le truc, c'est que mon GridView affiche automatiquement un colonne Modifier dans lequel, pour chaque ligne, il y a un lien hypertexte "Modifier" qui mène vers une autre page en passant un numéro en paramètre.

    J'aimerais que en comparant un numéro enregistré en session avec un numéro retourné par la requête qui donne les données au GridView, je puisse choisir si oui on non, j'affiche le lien Hypertexte "Modifier" pour cet ligne.

    Je débute un peu en ASP.NET et je n'ai aucune idée de comment faire
    Quelqu'un peut m'aider svp ? Même une petite piste me serait utile.

    Merci de toutes réponses qui pourra m'aider,

    Cordialement,
    Wizard50

  2. #2
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut
    Le plus simple est de rajouter l'evenement RowDataBound au GridView

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.GridView1.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound);
    Ensuite dans la méthode qui est appellé lors du DataBind() pour chaque ligne, vérifier si la condition est vrai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    protected void CollectionGridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
          if (e.Row.RowType == DataControlRowType.DataRow)
          {
               //Recupere le numero de la requete
               int numRequete = Int32.Parse((DataRowView)e.Row.DataItem).Row["numRequete"]);
               //Si le numero est different de la session, alors on efface le texte
               //Cells[i] ou i correspond à la colonne du CommandField
               if (numRequete != Int32.Parse(Session["numSession"].ToString()))
                      e.Row.Cells[0].Text = String.Empty;
           }
    }

  3. #3
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Bon je pense comprendre ta méthode Cependant, j'obtiens un bon message d'erreur avec mon code :
    La valeur ne peut pas être null. Nom du paramètre : string.
    Voici le code de ma méthode qui remplit le GridView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
        protected void RemplirListeRecording()
        {
            CodeClassroom = DropDownList1.SelectedItem.Value;
     
            if (IsPostBack)
            {
                txtJourneyDate = (string)ViewState["txtJourneyDate"];
                CodeClassroom = DropDownList1.SelectedItem.Value;
                this.GridView1.RowDataBound += new GridViewRowEventHandler(CollectionGridView1_RowDataBound);
            }
     
                try
                {
                    this.GridView1.EmptyDataText = "Pas d'évènements disponible pour cette journée";
                    this.Etq_Date_Choisis.Text = "Evènements disponible pour le " + txtJourneyDate;
     
                    Req = "SELECT NORECORDING, to_char(DATE_START_RECORDING,'HH24:MI') AS Date_Start, to_char(DATE_FINISH_RECORDING,'HH24:MI') AS Date_Finish, LIBELLER, NOTEACHER ";
                    Req += "FROM RECORDING ";
                    Req += "WHERE CODECLASSROOM ='" + CodeClassroom + "'";
                    Req += "AND to_char(DATE_START_RECORDING,'DD/MM/YYYY') LIKE '" + this.txtJourneyDate + "'";
     
                    Cmd = new OracleCommand(Req, Cnx);
                    Jdd = Cmd.ExecuteReader();
                    this.GridView1.DataSource = Jdd;
                    this.GridView1.DataBind();
                    Jdd.Read();
                    noRequete = Jdd[4].ToString();
                    Jdd.Close();
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
                }
        }
    Puis le code de CollectionGridView1_RowDataBound()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        protected void CollectionGridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
          if (e.Row.RowType == DataControlRowType.DataRow)
          {
            if (Int32.Parse(noRequete) != Int32.Parse(noTeacher))
            {
                e.Row.Cells[4].Text = string.Empty;
            }
           }
        }
    Merci de ton aide
    Elle m'est bien précieuse

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Par défaut
    demande toi d'où viennent les valeurs de tes variables noRequete et noTeacher

    relis le code fournis par User.Anonymous et regarde comment il récupère les informations depuis la grid et depuis la session.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int numRequete = Int32.Parse((DataRowView)e.Row.DataItem).Row["numRequete"]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int32.Parse(Session["numSession"].ToString()

  5. #5
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    C'est justement sa le truc : j'ai bien suivi ce qu'a dit User.Anonymous en apportant les modifications nécessaires.
    Car en effet, le numéro que je récupère de ma requête qui construit le GridView, je ne l'affiche pas dans le GridView

    Application

    Voici la première ligne de ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Req = "SELECT NORECORDING, to_char(DATE_START_RECORDING,'HH24:MI') AS Date_Start, to_char(DATE_FINISH_RECORDING,'HH24:MI') AS Date_Finish, LIBELLER, NOTEACHER ";
    Dans mon GridView, j'affiche Date_Start, Date_Finish, Libeller; puis j'aimerais récupérer le NOTEACHER de chaque ligne et le comparer au contenu de la variable NoTeacher qui contient ma variable de session, et ainsi afficher ou non le lien Hypertexte "Modifier" dans la cellule.

    Je pense pourtant avoir initialiser le RowDataBound au bonne endroit mais il semblerait que non ...

    Merci de ta réponse en tout cas

  6. #6
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut
    Et comme ca, ca ne marches pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
               //Recupere le numero de la requete
               int numRequete = Int32.Parse((DataRowView)e.Row.DataItem).Row["NOTEACHER"]);
               //Si le numero est different de la session, alors on efface le texte
               //Cells[i] ou i correspond à la colonne du CommandField
               if (numRequete != Int32.Parse(Session["NoTeacher"].ToString()))
                      e.Row.Cells[0].Text = String.Empty;
    Ton "NOTEACHER" est unique a chaque ligne donc ce sera forcement dans la méthode RowDataBound que tu pourra recuperer celui correspondant à ta ligne.

    Je pense pourtant avoir initialiser le RowDataBound au bonne endroit mais il semblerait que non ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.GridView1.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound);
    A mettre dans Page_Init ou Page_Load, sinon à déclarer dans la feuille .aspx

  7. #7
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Merci de ton aide

    Alors voici la ligne que je t'ai repris en ajoutant les parenthèse et le ToString() pour que cela fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int numRequete = Int32.Parse(((((DataRowView)e.Row.DataItem).Row["NOTEACHER"]).ToString()));
    Et voici ce qu'il m'affiche :

    Impossible d'effectuer un cast d'un objet de type 'System.Data.Common.DataRecordInternal' en type 'System.Data.DataRowView'
    J'en conclus donc que cet ligne comporte une erreur de transtypage mais je ne comprend pas bien d'où sort le System.Data.Common.DataRecordInternal ...

    ---------------------- EDIT ------------------------

    J'ai lu sur un forum qu'une personne avait eu le même message que moi en essayant de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataRowView dr = (DataRowView)e.Item.DataItem;
    Et on lui a répondu :

    DataReaders are faster. Use DataReader bindings and then in ItemDataBound:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Data.Common.DbDataRecord rd = (System.Data.Common.DbDataRecord)e.Item.DataItem;

  8. #8
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Bon alors voici ce que j'ai essayé de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              DbDataRecord dr = (DbDataRecord)e.Row.DataItem;
              Int32 numRequete = dr.GetInt32(4);
    Mais du coup, Studio 2008 me dit :

    Le cast spécifié est invalide

  9. #9
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut
    Met un point de debug sur e.Row.DataItem et regardes le type de l'objet. Je n'utilise que les DataSet, je ne te serais pas très utile pour ce cast

    Néanmoins le principe est là, tu récupères la ligne de données et la transformes lors de sa liaison avec la grille.

  10. #10
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Merci de ta réponse.

    En fait, j'ai profité de mon temps libre ce weekend pour tester cette petite modif qui ma foi, fonctionne très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        protected void CollectionGridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
          if (e.Row.RowType == DataControlRowType.DataRow)
          {
              noRequete = Int32.Parse(Jdd[4].ToString());
     
               if (noRequete != Int32.Parse(noTeacher))
               {
                   e.Row.Cells[3].Text = "";
               }
           }
        }
    Le souci, c'est que à chaque PostBack ( quand par exemple, je choisi autre chose dans ma DropDownList ce qui provoque la PostBack ), Studio 2008 m'affiche ce message d'erreur, bien qu'il fasse correctement ce qui lui est demandé :

    Le paramètre ne peut pas être null.
    Type de paramètre : string
    J'ai cherché sur internet mais je ne vois pas d'où sa peut venir.

  11. #11
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Sa y'est je pense pouvoir m'auto-proclamer boulet du mois !

    L'évidence était telle que je me suis pris la tête avec des sottises et je me suis perdu dans les méandres de MSDN, dans une page tellement reculé de ce site que j'arrivais plus à voir l'arborescence sur la gauche !

    En effet, c'est logique !

    Dans la méthode SelectionListeRecording(), méthode qui permet de sélectionner les matières enseigné par un professeur, il fallait tout simplement enregistrer le noTeacher dans le ViewState

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ViewState["noTeacher"] = noTeacher;
    Puis le ressortir dans la méthode qui remplit le GridView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if (IsPostBack)
            {
                CodeClassroom = DropDownList1.SelectedItem.Value;
                txtJourneyDate = (string)ViewState["txtJourneyDate"];
                noTeacher = (string)ViewState["noTeacher"];
    Sinon lorsque je clic sur un nouvel élément dans ma DropDownList, le GridView se recharge, appel le RowDataBound, mais tente d'effectuer la comparaison entre le noRequete retourné par la requête du GridView et ... et un noTeacher qui n'existe plus à cause du PostBack

    Voilàààààààààààààà merci à vous pour votre aide

  12. #12
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut
    Pour t'éviter ces soucis, penses aux accesseurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public int NoTeacher
    {
         get
         {
              object o = ViewState["noTeacher"];
              if (o != null)
                   return int.Parse(ViewState["noTeacher"].ToString());
              else
                   return -1;
         }
         set
         {
               ViewState["noTeacher"] = value;
         }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Petite question concernant la notation utilisée dans une requête
    Par jlb59 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 31/01/2008, 09h40
  2. Petite question concernant Upnp
    Par lolblablatos dans le forum Web & réseau
    Réponses: 1
    Dernier message: 19/11/2007, 22h07
  3. Petite question concernant la boite d'alimentation
    Par pop10 dans le forum Composants
    Réponses: 2
    Dernier message: 06/11/2007, 19h07
  4. Réponses: 2
    Dernier message: 07/05/2007, 16h46
  5. Réponses: 11
    Dernier message: 21/06/2005, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo