none
Comment comparer une variable provenant d'une collection à celle provenant d'une list(of double)? RRS feed

  • Question

  • Bonjour

    Voici le contexte du problème: Je crée une liste de nombres que je stocke dans une liste :

    Private LaListeDesSolutions As New List(Of Double)
    

    L'utilisateur entre dans un textbox sa réponse: en fait j'ai 10 texbox dans un panel, il rentre donc 10 réponses. Puis au click sur un bouton je dois comparer le contenu des fameux textbox avec celui de ma liste afin de valider ou non la réponse.

    J'ai donc dans le form load créé une collection qui contient tous les textbox réponse.

    Private ExtTxBxAnswers As New Collection
    

    Et là je coince pour comparer le contenu de chaque textbox à celui de l'item de la liste qui lui correspond. J'ai fait un truc très lourdingue auparant avec des if et des select case qui fonctionne, mais je pense qu'avec une collection de textbox je dois arriver à la même chose en moins de lignes de code?

     Private Sub ButtonVerifier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonVerifier.Click
        Reussite = 0
        For Each ctrl As Control In TableLayoutPanel1.Controls
          If TypeOf (ctrl) Is TextBox Then
            Select Case CInt(ctrl.Tag)
              Case 1
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(0)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
              Case 2
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(1)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
              Case 3
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(2)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
              Case 4
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(3)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
              Case 5
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(4)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
              Case 6
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(5)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
              Case 7
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(6)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
              Case 8
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(7)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
              Case 9
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(8)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
              Case 10
                If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
                  If CInt(ctrl.Text) = CInt(LaListeDesSolutions(9)) Then
                    ctrl.ForeColor = Color.Green
                    Reussite += 1
                  Else
                    ctrl.ForeColor = Color.Red
                  End If
                End If
    
            End Select
          End If
        Next
        'Calcul et affichage du % de réussite
        LabelScore.Text = CStr((Reussite / 10) * 100) & " % de réussite."
    
      End Sub
    
    Que je cherche à remplacer par quelque chose du type :
      Private Sub ButtonVerifier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonVerifier.Click
        Reussite = 0
        For Each txtbox As ExtendedTextbox In ExtTxBxAnswers
    
          Dim i As Integer
          For i = 1 To 10
            If Not String.IsNullOrEmpty(CStr(ExtTxBxAnswers(i))) And IsNumeric(ExtTxBxAnswers(i)) Then
              If Val(ExtTxBxAnswers(i).ToString) = (LaListeDesSolutions(i - 1)) Then
                ExtTxBxAnswers(i).ForeColor = Color.Green
                Reussite += 1
              Else
                ExtTxBxAnswers(i).ForeColor = Color.Red
              End If
            End If
          Next i
        Next
    
       
        'Calcul et affichage du % de réussite
        LabelScore.Text = CStr((Reussite / 10) * 100) & " % de réussite."
    
      End Sub
    

    Mais biensûr qui ne fonctionne pas dans l'état. Je crois avoir compris que ExtTxBxAnswers(i) ne représente pas le texte que contient ce contrôle comme je le pensais...

    Comment donc récupérer ce texte?

    merci


    Cordialement
    Pascal
    http://www.scalpa.info
    samedi 30 avril 2011 09:33

Réponses

  •  
    > Bonjour
    >
    Bonjour,
    Je pense que tu n'étais pas loin :
     
    >      Reussite = 0
    >      For  Each  ctrlAs  ControlIn  TableLayoutPanel1.Controls
    >        If  TypeOf  (ctrl)Is  TextBoxThen
    >              If  Not  String.IsNullOrEmpty(ctrl.Text)And  IsNumeric(ctrl.Text)Then
    >                If  CInt(ctrl.Text) =CInt(LaListeDesSolutions(CInt(ctrl.Tag) -1))Then
    >                  ctrl.ForeColor = Color.Green
    >                  Reussite += 1
    >                Else
    >                  ctrl.ForeColor = Color.Red
    >                End  If
    >              End  If
    >        End  If
    >      Next
    >      'Calcul et affichage du % de réussite
    >      LabelScore.Text =CStr((Reussite / 10) * 100)&  " % de réussite."
    >
    >    End  Sub
     
    Par contre, il y a une petite incohérence entre le type de ta liste de
    solutions (Double) et les conversions dans le code (CInt).
    Également, tu peux utiliser Int32.TryParse (pour vérifier et
    éventuellement convertir pour ctrl.Text) ou Int32.Parse (pour convertir
    lorsqu'il n'y a pas de doute, comme avec ctrl.Tag)
     --
    Fred
    foleide@free.fr
     
     
    • Marqué comme réponse scalpa samedi 30 avril 2011 16:34
    samedi 30 avril 2011 11:34

Toutes les réponses

  • Bonjour Scalpa,
    Si ma répone te sied, un petit point pour moi sera le bienvenu, voici le code sous-cité qui est testé, par contre je n'ai pas tenu compte du container, faisant une indexation direct sur les objets :
    Option Explicit On
    Public Class Form1
     Dim TB As New Collection()
    
     Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      Dim i As Integer = 1
      TB.Add(Me.TextBox1)
      TB.Add(Me.TextBox2)
      TB.Add(Me.TextBox3)
      TB.Add(Me.TextBox4)
      TB.Add(Me.TextBox5)
      TB.Add(Me.TextBox6)
      TB.Add(Me.TextBox7)
      TB.Add(Me.TextBox8)
      TB.Add(Me.TextBox9)
      TB.Add(Me.TextBox10)
      TB(i).text = "un" : i = i + 1 ' CHARGEMENT POUR LE TEST
      TB(i).text = "deux" : i = i + 1
      TB(i).text = "trois" : i = i + 1
      TB(i).text = "quatre" : i = i + 1
      TB(i).text = "cinq" : i = i + 1
      TB(i).text = "six" : i = i + 1
      TB(i).text = "sept" : i = i + 1
      TB(i).text = "huit" : i = i + 1
      TB(i).text = "neuf" : i = i + 1
      TB(i).text = "dix"
      ListBox1.Items.Clear()
      ListBox1.Items.Add("zéro")
      ListBox1.Items.Add("deux")
      ListBox1.Items.Add("quatre")
      ListBox1.Items.Add("six")
      ListBox1.Items.Add("huit")
      ListBox1.Items.Add("dix")
      ListBox1.Items.Add("douze")
     End Sub
    
     Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim i As Integer
      Dim j As Integer
      Dim t As String
      For i = 1 To 10
       For j = 0 To ListBox1.Items.Count - 1
        If TB(i).text = ListBox1.Items(j) Then
         t = "textbox" & i & " = listbox1(" & j & ")" & vbLf & vbLf
         t = t & TB(i).text & " = " & ListBox1.Items(j) & vbLf
         MsgBox(t, vbInformation)
         Exit Sub
        End If
       Next j
      Next
      MsgBox("Non trouvé", vbExclamation)
    
     End Sub
    End Class
    
    

    Cordialement


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe samedi 30 avril 2011 18:18
    samedi 30 avril 2011 11:24
  •  
    > Bonjour
    >
    Bonjour,
    Je pense que tu n'étais pas loin :
     
    >      Reussite = 0
    >      For  Each  ctrlAs  ControlIn  TableLayoutPanel1.Controls
    >        If  TypeOf  (ctrl)Is  TextBoxThen
    >              If  Not  String.IsNullOrEmpty(ctrl.Text)And  IsNumeric(ctrl.Text)Then
    >                If  CInt(ctrl.Text) =CInt(LaListeDesSolutions(CInt(ctrl.Tag) -1))Then
    >                  ctrl.ForeColor = Color.Green
    >                  Reussite += 1
    >                Else
    >                  ctrl.ForeColor = Color.Red
    >                End  If
    >              End  If
    >        End  If
    >      Next
    >      'Calcul et affichage du % de réussite
    >      LabelScore.Text =CStr((Reussite / 10) * 100)&  " % de réussite."
    >
    >    End  Sub
     
    Par contre, il y a une petite incohérence entre le type de ta liste de
    solutions (Double) et les conversions dans le code (CInt).
    Également, tu peux utiliser Int32.TryParse (pour vérifier et
    éventuellement convertir pour ctrl.Text) ou Int32.Parse (pour convertir
    lorsqu'il n'y a pas de doute, comme avec ctrl.Tag)
     --
    Fred
    foleide@free.fr
     
     
    • Marqué comme réponse scalpa samedi 30 avril 2011 16:34
    samedi 30 avril 2011 11:34
  • mERCI POUR VOTRE AIDE.

    Je teste cette solution pour tous les cas de figure y compris ceux où les nombres sont des entiers et il semble que la conversion en double (même dans le cas où les nombres sont entiers) fonctionne.

    Private Sub ButtonVerifier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonVerifier.Click
        Reussite = 0
        For Each ctrl As Control In TableLayoutPanel1.Controls
          If TypeOf (ctrl) Is TextBox Then
            If Not String.IsNullOrEmpty(ctrl.Text) And IsNumeric(ctrl.Text) Then
              If CDbl(ctrl.Text) = CDbl(LaListeDesSolutions(CInt(ctrl.Tag) - 1)) Then
                ctrl.ForeColor = Color.Green
                Reussite += 1
              Else
                ctrl.ForeColor = Color.Red
              End If
            End If
          End If
        Next
        'Calcul et affichage du % de réussite
        LabelScore.Text = CStr((Reussite / 10) * 100) & " % de réussite."
    
      End Sub
    

    Tu as raison Foleide j'avais noté l'incohérence aussi. Je ne pensais pas avoir besoin de nombres décimaux au début de la création de programme... Il faut maintenant que je teste si la solution du dessus convient vraiment tout le temps.

    merci à vous bon wwek-end

     


    Cordialement
    Pascal
    http://www.scalpa.info
    samedi 30 avril 2011 16:34