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

VB.NET Discussion :

Portée des variables dans une classe [Débutant]


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut Portée des variables dans une classe
    Bonjour à tous,

    Je voudrais savoir quelle est la porté de ma variable, voici le code :

    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
    Partial Class SearchByBatch
         Inherits System.Web.UI.Page
     
         Private _batchValues As BatchValues = New BatchValues
     
         Protected Sub ButtonSearch_Click() Handles ButtonSearch.Click
              If TextBoxSearch.ToString <> "" Then
                   Try
                        _batchValues.gridViewValues(Me.TextBoxSearch.Text.ToString, Me.ph)
                   Catch ex As Exception
                        MsgBox(ex.Message)
                   End Try
              End If
     
              For Each element In _batchValues.listCheckBox
                   MsgBox("test")
                   'J'ai plusieurs box qui s'affichent
              Next
         End Sub
     
         Protected Sub ButtonExportExcel_Clik() Handles ButtonExport.Click
              For Each element In _batchValues.listCheckBox
                   MsgBox("test")
                   'Et là rien ne s'affiche ..
              Next
         End Sub
     
    End Class
    Pourquoi est-ce que j'ai des "test" qui s'affichent dans ma première méthode alors que dans la deuxième non ?

    J'ai pourtant déclarée la variable avant mes méthodes, elle devrait être "globale" au deux méthodes ?

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Parce que _batchValues.listCheckBox est vide (ne contient aucun élément). Donc tu ne rentre pas dans la boucle.
    N'oubliez pas le tag et

  3. #3
    Membre du Club
    Homme Profil pro
    Chargé de commercialisation
    Inscrit en
    Août 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de commercialisation
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2013
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    et pour te convaincre de cette réponse pertinente met ta msgbox(test) avant ton for each ... meilleur debug du monde

    sinon le pas à pas est ton ami ça te permet de contrôler ce que tu fais

  4. #4
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    Les Msgbox servaient juste pour démontrer l'exemple.

    J'ai compris que ma fonction _batchValues.listCheckBox ne renvoi rien.

    Ce que je ne comprends pas, c'est pourquoi vu que ma variable est globale à la classe ?

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Jah73 Voir le message
    Ce que je ne comprends pas, c'est pourquoi vu que ma variable est globale à la classe ?
    Debug pas à pas en mettant un point d'arrêt sur la ligne 7 de ton code (cf. ton premier post), sur le IF. Regarde si tu rentres bien dedans.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  6. #6
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    Merci pour vos réponses

    Petite précision, c'est de l'ASP.NET avec du VB.NET

    J'ai compris ce qui se passe :

    Quand mon programme arrive à la fin de ma méthode ButtonSearch_Click
    , il "détruit" la classe. Du coup, après mon END SUB, ma variable _batchValues n'existe plus.

    Comment je peux faire ?

    En gros, voila ce que fait mon programme :

    L'utilisateur clique sur le bouton search et la méthode _batchValues.gridViewValues(Me.TextBoxSearch.Text.ToString, Me.ph) est excécutée.

    Dans cette méthode, je créé une liste de checkbox "customs" qui me permettent d'avoir des valeurs associées a chacune d'entre elle.

    _batchValues.listCheckBox me permet de récupérer cette liste.

    Grace à ma méthode ButtonExportExcel_Clik(), j'aimerai récupérer cette liste mais elle est vide comme la classe a été "détruite"

    J'espère que vous comprenez mon problème

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Effectivement si c'est du Web, il faut persister ton objet... Pour ce faire, en supposant que l'objet soit différent pour chacun des utilisateurs, tu peux utiliser la Session.

    Première étape, lors du click sur le bouton, tu stockes ton objet dans la session, avec un code du genre :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Protected Sub ButtonSearch_Click(sender As Object, e As EventArgs)
    	' On insère les valeurs en session
    	Session("TonObjet") = _batchValues.gridViewValues(Me.TextBoxSearch.Text.ToString(), Me.ph)
    End Sub
    Ensuite, dans ton évènement pour l'export, tu vérifies si l'objet existe en session. Si c'est le cas, tu le prends en compte, avec un truc du genre :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Protected Sub ButtonExportExcel_Clik(sender As Object, e As EventArgs)
    	If Session("TonObjet") IsNot Nothing Then
    		Dim tonObjet = TryCast(Session("TonObjet"), BatchValues)
     
    		If tonObjet IsNot Nothing Then
    			' Le traitement sur "tonObjet"...
    		End If
    	End If
    End Sub
    Si ton objet est commun entre tous les utilisateurs, au lieu d'utiliser la Session, utilise plutôt l'Application ou encore le Cache.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  8. #8
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    C'est exactement ça

    Merci beaucoup DotNetMatt !

    Voici le code :

    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
    Protected Sub ButtonSearch_Click() Handles ButtonSearch.Click
         If TextBoxSearch.ToString <> "" Then
              Try
                   _batchValues.gridViewValues(Me.TextBoxSearch.Text.ToString, Me.ph)
                   Session("list") = _batchValues.listCheckBox
              Catch ex As Exception
                   MsgBox(ex.Message)
              End Try
         End If
    End Sub
     
    Protected Sub ButtonExportExcel_Clik() Handles ButtonExport.Click
         If Session("list") IsNot Nothing Then
              For Each element In Session("list")
                  'Traitement
              Next
         End If
    End Sub

  9. #9
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    J'ai besoin d'un dernier renseignement :

    Je n'arrive pas à recuperer les checkbox qui sont "Checked", même avec ce code :

    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
    Protected Sub ButtonSearch_Click() Handles ButtonSearch.Click
         If TextBoxSearch.ToString <> "" Then
              Try
                   _batchValues.gridViewValues(Me.TextBoxSearch.Text.ToString, Me.ph)
                   Session("list") = _batchValues
              Catch ex As Exception
                   MsgBox(ex.Message)
              End Try
         End If
    End Sub
     
    Protected Sub ButtonExportExcel_Clik() Handles ButtonExport.Click
         If Session("list") IsNot Nothing Then
              For Each element In Session("list").listCheckBox
                   If element.checkBox.Checked Then
                        'Traitement
                   End If
              Next
         End If
    End Sub
    Tous les checked sont a false

  10. #10
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Et si tu castes Session("list") ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  11. #11
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    Bonjour DotNetMatt,

    J'ai effectué un cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Protected Sub ButtonExportExcel_Clik() Handles ButtonExport.Click
         Dim batchValue = TryCast(Session("list"), BatchValues)
     
         If batchValue IsNot Nothing Then
              For Each element In batchValue.listCheckBox
                   If element.checkBox.Checked Then
                        'Traitement
                   End If
              Next
         End If
    End Sub
    Les valeurs associées aux checkbox sont bonnes sauf le "Checked" qui n'est pas "mis à jour".

    element.checkBox.Checked reste à false

  12. #12
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Est-ce que dans ta méthode _batchValues.gridViewValues() tu mets bien des valeurs à true dans le résultat retourné ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  13. #13
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    C'est à dire des valeurs à true ?

    Cette méthode fait partie de mon "controller" me crée des gridViews et checkbox dynamiquement que je stocke dans un PlaceHolder via un ph.Controls.Add(..)

  14. #14
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Désolé, la question n'était pas claire et en plus je me suis embrouillé les pinceaux dans ton code

    Est-ce que dans la variable _batchValues tu as bien les bonnes valeurs ? Est-ce que tu récupères correctement l'état des controls (checked ou non) ?

    Met un point d'arrêt sur la ligne Session("list") = _batchValues de la méthode ButtonSearch_Click et regarde son contenu afin d'en être sûr.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  15. #15
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    Pas de souci

    Dans mon message #11, je disais :

    "Les valeurs associées aux checkbox sont bonnes sauf le "Checked" qui n'est pas "mis à jour"."

    Voici un screen :

    Nom : val.png
Affichages : 148
Taille : 24,9 Ko
    Désolé je suis obligé de cacher les valeurs ..

    Et quand je coche les cases avant d'appuyer sur mon bouton, ca ne met pas à jour le "chekced"

  16. #16
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Un conseil si tu utilises ta list seulement sur cette page et que tu en as pas besoin sur d'autre page utilise le Viewstate plutôt que la Session.

  17. #17
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    @youtpout978 : Merci pour ta réponse,
    Si j'utilise un ViewState("list") = _batchValues, ca ne fonctionne pas, ca me met une erreur :

    Une exception non gérée s'est produite lors de l'exécution de la requête Web actuelle. Les informations relatives à l'origine et l'emplacement de l'exception peuvent être identifiées en utilisant la trace de la pile d'exception ci-dessous.

  18. #18
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Sans l'erreur ça sera difficile de t'aider, normalement si l'objet tu peux le stocker en session tu peux aussi le stocker dans le viewstate à part si tu empêche l'utilisation du viewstate, reste en session si le viewstate ne fonctionne pas.

  19. #19
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ok en fait avec ton autre post je pense que tu as un problème dans la gestion du cycle de vie de ta page.

    Comme tu peux le voir sur la page ASP.NET Page Life Cycle Overview, la gestion du postback se fait après le load. Donc il est probable que ton GridView soit réinitialisé à chaque fois, d'où le fait que tu ne récupères jamais les valeurs checked = true.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  20. #20
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    @youtpout978 : Effectivement, désolé

    Voici l'erreur :

    Le type 'CheckBoxCustom' dans l'assembly 'App_Code.qzxkpeim, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' n'est pas marqué comme sérialisable.

    Description : Une exception non gérée s'est produite au moment de l'exécution de la requête Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

    Détails de l'exception: System.Runtime.Serialization.SerializationException: Le type 'BatchValues' dans l'assembly 'App_Code.qzxkpeim, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' n'est pas marqué comme sérialisable.
    @DotNetMatt :

    Comment je peux faire pour y remédier ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Portée d'une variable dans une classe
    Par jeff0123 dans le forum Langage
    Réponses: 7
    Dernier message: 12/02/2014, 15h30
  2. Regrouper des variables dans une nouvelle classe
    Par saraharas dans le forum SAS Base
    Réponses: 2
    Dernier message: 13/06/2011, 15h27
  3. [C#2005] Stocker des variables dans une classe
    Par Herlece dans le forum Windows Forms
    Réponses: 7
    Dernier message: 13/10/2008, 10h30
  4. Pouvoir gérer les actions des boutons dans une classe
    Par Cyborg289 dans le forum Composants
    Réponses: 2
    Dernier message: 08/07/2005, 12h08
  5. Réponses: 2
    Dernier message: 27/03/2005, 16h09

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