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 :

la conversion de la chaine "" en type boolean n'est pas valide


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2010
    Messages : 168
    Points : 55
    Points
    55
    Par défaut la conversion de la chaine "" en type boolean n'est pas valide
    Bonjour,
    je veux faire un calcule dans une datagridview voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim total As Double = 0
                For i As Integer = 0 To Me.DataGridView1.Rows.Count - 2
                    If Not IsDBNull(Me.DataGridView1.Rows(i).Cells("liv").Value) Then
                        If CBool(Me.DataGridView1.Rows(i).Cells("liv").Value) = True Then
                            total = total + Val(Me.DataGridView1.Rows(i).Cells("DET_DEV_MONT").Value)
                            Me.TXT_HT.Text = Math.Round(total, 2)
                        End If
                    End If
                Next
    et voici l'erreur
    la conversation de la chaine "" en type boolean n'est pas valide
    Merci d'avance

  2. #2
    Futur Membre du Club
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    salut,

    Le problème c'est que tu cast une chaine de caractère en booléen. A quoi te sert il ce cast?
    (sachant que tu teste deja avant avec IsdbNull si le champ est null ou pas)

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2010
    Messages : 168
    Points : 55
    Points
    55
    Par défaut
    j'ai déja fait le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Not IsDBNull(Me.DataGridView1.Rows(i).Cells("liv").Value)
    Salutations

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Ta case ne contient en effet pas "DBnull", mais en revanche il contient une chaîne vide.... ce qui ne va pas.

    Cette case est censé contenir quoi ?

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2010
    Messages : 168
    Points : 55
    Points
    55
    Par défaut
    je vous expliquer
    j'ai une datagridviex contient des case en checkbox et je veux faire le calcule des lignes qui sont sélectionner et qui sont pas sélectionner il faut pas les calculer et voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Dim total As Double = 0
                For i As Integer = 0 To Me.DataGridView1.Rows.Count - 2
                    If Not IsDBNull(Me.DataGridView1.Rows(i).Cells("liv").Value) Then
                        If CBool(Me.DataGridView1.Rows(i).Cells("liv").Value) = True Then
                            total = total + Val(Me.DataGridView1.Rows(i).Cells("DET_DEV_MONT").Value)
                            Me.TXT_HT.Text = Math.Round(total, 2)
                        End If
                    End If
                Next
    merci d'avance

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    le problème c'est que le cast que tu fais n'est pas possible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CBool(Me.DataGridView1.Rows(i).Cells("liv").Value)
    Pourquoi veux tu faire ce cast au juste?

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2010
    Messages : 168
    Points : 55
    Points
    55
    Par défaut
    ça veux dire si la ligne est coché il faut ajouter au calcule si nn c'est pas la peine

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Utilise plutot un For Each à la place du for, et un SelectedRows à la place de Rows.

    Ta conversion de la valeur en null ne donne actuellement pas si elle est selectionnée ou non.
    Il y a des attributs SelectedCells, SelectedColumns et SelectedRows dans le DatagridView pour ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For each row as datagridviewrow in Me.DataGridView1.SelectedRows
    If Not IsDBNull(row.Cells("liv").Value) Then
     
    total = total + Val(row.Cells("DET_DEV_MONT").Value)
    Me.TXT_HT.Text = Math.Round(total, 2)
     
    End If
    Next
    Tu vas parcourir seulement les lignes sélectionnées, celles dont tu as besoin donc.

    Cependant sur ton datagridview dans SelectionMode, choisis CompleteRow afin que lorsque l'on clique sur une cellule ça soit toute la ligne qui soit selectionnée.

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2010
    Messages : 168
    Points : 55
    Points
    55
    Par défaut
    merci asmduty
    pour l'instant l'erreur ca fiche pas mais le code fait pas le calcule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim total As Double = 0
                For i As Integer = 0 To Me.DataGridView1.Rows.Count - 2
                    For Each row As DataGridViewRow In Me.DataGridView1.SelectedRows
                        If Not IsDBNull(Me.DataGridView1.Rows(i).Cells("liv").Value) Then
                            If CBool(Me.DataGridView1.Rows(i).Cells("liv").Value) = True Then
                                total = total + Val(Me.DataGridView1.Rows(i).Cells("DET_DEV_MONT").Value)
                                Me.TXT_HT.Text = Math.Round(total, 2)
                            End If
                        End If
                    Next
                Next
    merci

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Ton code est à remplacer par le mien et en théorie ça doit fonctionner.
    Garde juste ton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim total As Double = 0



    Si ça ne fonctionne pas, il faut mettre un point d'arret sur le for each, et poser des espions.

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2010
    Messages : 168
    Points : 55
    Points
    55
    Par défaut
    re bonjou,
    le code calcule tous les lignes qui sont cochés ou pas je sais pas qu'est ce que je doit faire,
    merci pour votre aide
    salutations

  12. #12
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Quand on veut programmer il faut quand même y mettre du sien et/ou avoir des bases et/ou lire correctement ce que l'on nous explique

    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
    Dim total As Double = 0
     
    'Pour chaque ligne sélectionnée dans le Datagridview1
    For each row as datagridviewrow in Me.DataGridView1.SelectedRows
     
    'Si "liv" n'est pas null
    If Not IsDBNull(row.Cells("liv").Value) Then
     
    'Tes calculs
    total = total + Val(row.Cells("DET_DEV_MONT").Value)
    Me.TXT_HT.Text = Math.Round(total, 2)
     
     
    End If
    Next

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    669
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 669
    Points : 1 168
    Points
    1 168
    Par défaut
    bonjour,

    si j'ai bien compris, il ne s'agit pas de faire la somme des lignes sélectionnées, mais des lignes cochées dans leur colonne "liv".

    Ces lignes ne sont donc pas nécessairement sélectionnées et à fortiori d'autant moins si le calcul est commandé depuis un bouton par exemple.

    MSDN : la classe DBNull fait la différence entre une variante VT_NULL, qui indique une valeur inexistante, et une variante VT_EMPTY, qui indique une valeur non spécifiée.
    Il faudrait essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                If Not DBNull.Value.Equals(Me.DataGridView1.Rows(i).Cells("liv").Value) Then
    ....................................
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                If Not Me.DataGridView1.Rows(i).Cells("liv").Value Is String.Empty Then

    séparément ou OrElse.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    j'ai une datagridviex contient des case en checkbox et je veux faire le calcule des lignes qui sont sélectionner et qui sont pas sélectionner il faut pas les calculer et voici mon code
    En effet, j'avais plus retenu le sélectionné que le checkbox =\

    Juste petit question concernant le OrElse, il analyse la première condition, et si elle est vérifiée n'analyse pas la seconde ?

  15. #15
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Citation Envoyé par asmduty Voir le message
    En effet, j'avais plus retenu le sélectionné que le checkbox =\

    Juste petit question concernant le OrElse, il analyse la première condition, et si elle est vérifiée n'analyse pas la seconde ?
    Citation Envoyé par asmduty Voir le message
    Quand on veut programmer il faut quand même y mettre du sien et/ou avoir des bases et/ou lire correctement ce que l'on nous explique
    Tu y vas un peu fort je trouve. un peu gonflé de parler d'y mettre du sien alors que tu poses une question novice sur un poste qui n'est même pas le tien.

    De plus tu as dis d'utiliser SelectedRows... ce qui est totalement faux et rends le code incorrect...
    Il ne va prendre en compte que les lignes surligné en bleu !! et non la totalité des lignes du datagridview.

    Najoua01, réutilise Me.DataGridView1.Rows !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CBool(Me.DataGridView1.Rows(i).Cells("liv").Value) = True
    était une très bonne idée.

    Ton problème viens du fait que si un checkbox n'est pas coché, au lieu de te renvoiyé False, il renvois une chaine vide. Donc tu ne paux pas utilisé CBool.

    Ensuite pour savoir ce que "row.Cells("liv").Value" te renvois, fait ta boucle et montre ce qu'il contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For each row as datagridviewrow in Me.DataGridView1.Rows
           If Not IsDBNull(row.Cells("liv").Value) Then
     
                    Msgbox(row.Cells("liv").Value)
     
            End If
    Next
    Test ce code, avec des lignes cochés et des lignes pas cochés, alors tu verras ce que te revois "row.Cells("liv").Value".

    Par exemple "True" ou "1" ou autre chose.
    Si c'est "1", alors tu pourras modifier ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For each row as datagridviewrow in Me.DataGridView1.Rows
           If Not IsDBNull(row.Cells("liv").Value) Then
     
                    If (row.Cells("liv").Value = 1) Then
     
                           total = total + Val(Me.DataGridView1.Rows(i).Cells("DET_DEV_MONT").Value)
                            Me.TXT_HT.Text = Math.Round(total, 2)
                     End If
            End If
    Next
    Par contre si "row.Cells("liv").Value" te renvois la chaine de caractères "true", alors remplace:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (row.Cells("liv").Value = 1) Then


    Par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If String.Compare(row.Cells("liv").Value, "True) Then
    Tu vois le truc ?

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2010
    Messages : 168
    Points : 55
    Points
    55
    Par défaut
    merci bcp chrismonoye
    c'est ça ce que je veux
    merci a tous

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    669
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 669
    Points : 1 168
    Points
    1 168
    Par défaut
    Citation Envoyé par asmduty Voir le message
    Juste petit question concernant le OrElse, il analyse la première condition, et si elle est vérifiée n'analyse pas la seconde ?
    Bonsoir,

    On lit souvent que OrElse doit être utilisé à la place de Or.
    Voici deux cas (plutôt alambiqués) où l'emploi de l'un est préférable à l'autre et vice-versa :

    1er cas:
    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
        Dim n1 As Integer = 0
        Dim n2 As Integer = 5
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            If n1 = 0 OrElse maFonction(10) > 9 Then
                Debug.Print(CStr(n2))
            End If
     
        End Sub
     
        Function maFonction(ByVal valeur As Integer) As Integer
            valeur += 10
            maFonction = valeur
            n2 += 10
     
        End Function
    puisque une des deux expressions,au moins, est satisfaite, on peut penser que par maFonction, n2 vaudra 5+10=15.
    et bien non, la 1ère expression étant vraie, l'application a pris le raccourci.
    donc attention aux expressions qui contiennent des appels de procédure.
    Ici Or est donc approprié, il évaluera les deux expressions.

    Second cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            If n1 = 0 Or 10 \ n1 = 5 Then
                Debug.Print("ok")
            End If
        End Sub
    Ici, Or provoque une erreur de tentative de division par 0, OrElse, tout en limitant le code, règle le problème.
    Bon, je réponds tardivement,de surcroit la discussion étant résolue et je suis hors sujet.

  18. #18
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Merci bien, il me semblait que le Or agissait tout seul de cette manière, mais avec ton exemple je comprends mieux pourquoi il ne le fait pas, sinon on serait embêté avec les appels de fonction.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/10/2014, 12h50
  2. Réponses: 9
    Dernier message: 17/06/2013, 16h21
  3. Réponses: 12
    Dernier message: 07/02/2011, 23h01
  4. Réponses: 13
    Dernier message: 02/11/2010, 16h03
  5. Réponses: 16
    Dernier message: 06/06/2007, 15h46

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