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 :

Vb.net probleme de cast


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut Vb.net probleme de cast
    Bonjour,

    Je rencontre un problème sur mon application, je doit faire une interface contenant un nombre relativement élevé de checkboxs et des textboxs. J'ai mit les checkboxs dans un panel et les textbox dans un autre et je les aie liés avec la propriété tag.
    Donc j'ai fais un code mais lors de la compilation j'ai un problème de cast lorsque je coche la checkbox.

    Voici L'erreur qui est affichée:
    Impossible d'effectuer un cast d'un objet de type 'System.Windows.Forms.Label' en type 'System.Windows.Forms.CheckBox'.
    Voici mon code si quelqu'un peut m'aider:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim ctl As CheckBox
    Dim tex As TextBox
     
    For Each ctl In Me.pnlcheck.Controls
    If ctl.Checked = True Then
    For Each tex In Me.pnltex.Controls
    If ctl.Tag = tex.Tag Then
    tex.Visible = True
    End If
    Next
    End If
    Next
    Merci d'avance

  2. #2
    Membre Expert 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 : 41
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Quelle ligne?

  3. #3
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonjour,

    Si jamais (ce qui semble être le cas) il y a au moins un autre type de contrôles que CheckBox dans ton panel, l'affectation dans la variable ctl en début de For each va vouloir caster (convertir) en CheckBox, malheureusement si ça échoue tu te retrouves avec l'erreur citée.
    Pour résoudre ce problème, je vais présenter deux solutions, dépendant de la version du framework que tu utilises, tout d'abord une solution générale qui marche dans tous les cas:

    Code VB.Net : 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
     
    'Note: OrElse fais en sorte que si le premier test renvoie True
    'le 2ème ne sera même pas évalué
    For Each ctrl1 As Control In pnlcheck.Controls
        'Si le contrôle n'est pas un CheckBox
        'ou s'il n'est pas coché on passe au suivant
        If Not TypeOf ctrl1 Is CheckBox OrElse Not DirectCast(ctrl1, CheckBox).Checked Then Continue For
     
        For Each ctrl2 As Control In pnltex.Controls
            'Si le contrôle n'est pas un TextBox
            'ou si les propriétés Tag sont différentes on passe au suivant
            'Note: Tag appartient à la classe Control, donc pas besoin de caster pour tester
            'De plus, Tag renvoie un Object donc il préférable d'utiliser Equals plutôt que =
            If Not TypeOf ctrl2 Is TextBox OrElse Not ctrl1.Tag.Equals(ctrl2.Tag) Then Continue For
     
            'Visible appartient également à la classe Control
            ctrl2.Visible = True
        Next
    Next

    Maintenant une autre approche si jamais tu utilises un framework de version supérieure ou égale à la 3.5 est d'utiliser Linq et les méthodes d'extension:
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    'Opère une jointure entre UNIQUEMENT les contrôles de type CheckBox qui sont cochés dans le premier panel
    'avec UNIQUEMENT les contrôles de type TextBox du second panel
    'en spécifiant comme critère de jointure l'égalité des Tag
    'et en récupérant une liste de TextBox
    Dim theConcernedTextBox As List(Of TextBox) = (From cb In pnlcheck.Controls.OfType(Of CheckBox)()
                                                   Where cb.Checked
                                                   Join tb In pnltex.Controls.OfType(Of TextBox)()
                                                   On cb.Tag Equals tb.Tag
                                                   Select tb).ToList
    'Permet de faire un For Each de manière plus courte pour une action simple
    theConcernedTextBox.ForEach(Sub(elem) elem.Visible = True)

    Je ne conseille pas une solution plus qu'une autre, je n'ai d'ailleurs pas fait de test pour vérifier si l'une était plus efficace que l'autre (même si je pense que le For Each qui parcourt tous les controles, et pour les valides toutes ses combinaisons doit être plus long qu'une jointure qui élimine d'office ceux qui ne correspondent pas aux critères)

    En espérant que cela t'aura aidé

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each ctl In Me.pnlcheck.Controls
    C'est cette ligne qui bug .

    Et pour répondre à mactwist69 je n'ai que des checkboxs dans le premier panel et que des textboxs dans l'autre, donc le probleme ne vient pas de là mais merci pour ton code ca va m'être utile pour la suite.

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    lu en diagonale

    je n'ai que des checkboxs dans le premier panel
    la preuve que tu as aussi un label surement

    faire typeof avant de caster

    et puis active option strict on car le code que tu as écris n'est pas sur (la preuve)

    ou alors si tu es sur le framework 3.5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    In pnlcheck.Controls.oftype(gettype(checkbox))
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut Résolution du problème de cast
    C'est bon j'ai trouvé une solution pour mon problème,
    Merci à tous et je laisse le code que j'ai fais si quelqu'un en a besoin !

    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
    Private Sub CheckBox22_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox22.CheckedChanged, CheckBox23.CheckedChanged, CheckBox24.CheckedChanged, CheckBox25.CheckedChanged, CheckBox26.CheckedChanged, CheckBox27.CheckedChanged, CheckBox28.CheckedChanged, CheckBox29.CheckedChanged, CheckBox30.CheckedChanged, CheckBox31.CheckedChanged, CheckBox32.CheckedChanged, CheckBox33.CheckedChanged, CheckBox34.CheckedChanged, CheckBox35.CheckedChanged, CheckBox36.CheckedChanged, CheckBox37.CheckedChanged, CheckBox38.CheckedChanged, CheckBox39.CheckedChanged, CheckBox40.CheckedChanged, CheckBox41.CheckedChanged, CheckBox42.CheckedChanged, CheckBox43.CheckedChanged  // Attention très important de mettre votre code dans toutes les checkboxs du panel si il y a pleins d'erreurs ou cela ne marche pas tout simplement
    
      Dim tx As Integer
      Dim ctl As Control
      Dim tex As Control
    
            For Each ctl In Me.pnlcheck3.Controls  // Pour chaque controle du panel 
                If TypeOf sender Is CheckBox And sender.checked = True Then // On regarde le type du sender(le controle clicker ou cocher par exemple) et si ce sender et une checkbox on regarde si elle est cochée 
                    tx = sender.TabIndex + 1 // si oui alors on lie le controle correspondant à la checkbox grace a tabindex (car control.tabindex = sender.tabindex+1)
                    For Each tex In Me.pnltex3.Controls 
                        If TypeOf tex Is TextBox And tex.TabIndex = tx Then  // on cherche les controls qui sont de type  textbox et on recherche le control.tabindex = sender.tabindex+1 vu precedement
                            tex.Enabled = True // une fois qu'on la trouvé on change sa propriété enabled dans ce cas.
                        End If
                    Next
    
    // idem pour ce qui suit c'est le même code avec des changement de valeur pour la checkbox et pour letat "enabled" du control
                ElseIf TypeOf sender Is CheckBox And sender.checked = False Then
                    tx = sender.TabIndex + 1
                    For Each tex In Me.pnltex3.Controls
                        If TypeOf tex Is TextBox And tex.TabIndex = tx Then
                            tex.Enabled = False
                        End If
                    Next
    
                End If
            Next

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

Discussions similaires

  1. [VB.NET] Deploiement / Probleme de Cast
    Par XnoTonio dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/06/2006, 14h09
  2. [VB.NET][dataset][datagrid] probleme de Cast
    Par graphicsxp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/05/2005, 14h18
  3. [VS.NET] Probleme d'ancrage
    Par krachunka dans le forum Visual Studio
    Réponses: 2
    Dernier message: 22/04/2004, 14h09
  4. [VB.Net] Probleme avec dialogues (confirm et alert)
    Par crackity_jones666 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 26/11/2003, 22h05

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