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 :

Contourner le Late binding [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Par défaut Contourner le Late binding
    Bonjour à tous !

    Je débute en VB (et en programmation en général) et je dois développer un petit outil très simple pour mon entreprise.

    La partie où j'effectue de simples calculs de pourcentages me pose problème :

    J'ai créé 6 collections :

    • Une collection de CheckBox : CollCB
    • Trois collections de TextBox : CollTB1, CollTB2 et CollTB3
    • Deux collections de Labels : CollR1 et CollR2 (pour Résultats)


    Ces 5 collections ont le même nombre d'éléments, et je procède comme suit :

    Si la CB d'indice i est cochée, j'affiche dans les labels d'indice i les résultats de calculs effectués sur le contenu des 3 textbox d'indice i.

    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
            For i As Integer = 1 To CollCB.Count
                If CollCB.Item(i).Checked = False Then
                    CollR1.Item(i).Text = ""
                    CollR2.Item(i).Text = ""
                Else
                    If IsNumber2(CollTB2.Item(i).Text) And IsNumber(CollTB1.Item(i).Text) Then
                        CollR1.Item(i).Text = Math.Round(CollTB2.Item(i).Text / CollTB1.Item(i).Text * 100, 2) & " %"
                    ElseIf CollTB1.Item(i).Text = "" Or CollTB2.Item(i).Text = "" Then
                        CollR1.Item(i).Text = "/"
                    Else
                        CollR1.Item(i).Text = "Erreur"
                    End If
                    If IsNumber(CollTB1.Item(i).Text) And IsNumber2(CollTB3.Item(i).Text) Then
                        CollR2.Item(i).Text = Math.Round(CollTB3.Item(i).Text / CollTB1.Item(i).Text * 100, 2) & " %"
                    ElseIf CollTB1.Item(i).Text = "" Or CollTB2.Item(i).Text = "" Then
                        CollR2.Item(i).Text = "/"
                    Else
                        CollR2.Item(i).Text = "Erreur"
                    End If
                End If
            Next
    Voilà. Or lorsque j'ai l'option Strict on, il me parle de Late Binding.

    J'ai bien compris qu'il s'agit d'un problème de cast implicite.

    Je pense avoir une explication partielle (voire partiellement fausse ) : pour lui, les collections pourraient très bien contenir des éléments qui n'ont pas la propriété .Text ou .Checked, etc, et donc il a peur de devoir convertir ?

    Comment contourner ce problème autrement qu'en supprimant l'option strict on ?

    Merci d'avance pour votre aide !


    PS : Au passage j'en profite pour poser une question vis-à-vis des collections.
    Dois-je vraiment me taper le CollCB.Add() pour chaque Checkbox etc ? (j'en ai beaucoup) ou y a-t-il un moyen de les ajouter dans le même ordre que leur TabIndex ou je ne sais pas, afin de faire correspondre les indices dans les différentes collections sans avoir à rentrer un par un chaque élément correspondant dans la collection qui va bien ?

    (Si quelqu'un a réussi à comprendre sans devoir relire, chapeau, mais au pire zappez cette question)

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    il nous faudrait le code de déclaration des collections

    il existe des collections typées ex: list(of checkbox)
    ca évite les cast
    sinon quand on est sur du type d'une variable on peut écrire directcast(instance,type)
    si on veut tester un type pendant l'exécution :
    if typeof instance is checkbox then ...

    si des controles doivent être liés ensemble, il est parfois préférable de faire un usercontrol qui les contient
    ensuite c'est ce usercontrol qu'on pose plusieurs fois et au moins ca isole le code dans le usercontrol qui ne peut pas se tromper de control à utiliser
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Par défaut
    Déclarations :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    Dim CollCB As New Collection
            CollCB.Add(Selection.CBCobb1)
            CollCB.Add(Selection.CBCobb2)
            CollCB.Add(Selection.CBCobb3)
            CollCB.Add(Selection.CBCyphose)
            CollCB.Add(Selection.CBLordose)
            CollCB.Add(Selection.CBInciPelv)
            CollCB.Add(Selection.CBVersionPelv)
            CollCB.Add(Selection.CBPenteSacree)
            CollCB.Add(Selection.CBObliquite)
            CollCB.Add(Selection.CBRotation1)
            CollCB.Add(Selection.CBRotation2)
            CollCB.Add(Selection.CBRotation3)
            CollCB.Add(Selection.CBSacral)
            CollCB.Add(Selection.CBBascule)
            CollCB.Add(Selection.CBBasculeT)
            Dim CollTB1 As New Collection
            CollTB1.Add(Cobb1_1)
            CollTB1.Add(Cobb2_1)
            CollTB1.Add(Cobb3_1)
            CollTB1.Add(Cyphose1)
            CollTB1.Add(Lordose1)
            CollTB1.Add(InciPelv1)
            CollTB1.Add(VersionPelv1)
            CollTB1.Add(PenteSacree1)
            CollTB1.Add(Obliquite1)
            CollTB1.Add(Rotation1_1)
            CollTB1.Add(Rotation2_1)
            CollTB1.Add(Rotation3_1)
            CollTB1.Add(Sacral1)
            CollTB1.Add(Bascule1)
            CollTB1.Add(BasculeT1)
            Dim CollTB2 As New Collection
            CollTB2.Add(Cobb1_2)
            CollTB2.Add(Cobb2_2)
            CollTB2.Add(Cobb3_2)
            CollTB2.Add(Cyphose2)
            CollTB2.Add(Lordose2)
            CollTB2.Add(InciPelv2)
            CollTB2.Add(VersionPelv2)
            CollTB2.Add(PenteSacree2)
            CollTB2.Add(Obliquite2)
            CollTB2.Add(Rotation1_2)
            CollTB2.Add(Rotation2_2)
            CollTB2.Add(Rotation3_2)
            CollTB2.Add(Sacral2)
            CollTB2.Add(Bascule2)
            CollTB2.Add(BasculeT2)
            Dim CollTB3 As New Collection
            CollTB3.Add(Cobb1_3)
            CollTB3.Add(Cobb2_3)
            CollTB3.Add(Cobb3_3)
            CollTB3.Add(Cyphose3)
            CollTB3.Add(Lordose3)
            CollTB3.Add(InciPelv3)
            CollTB3.Add(VersionPelv3)
            CollTB3.Add(PenteSacree3)
            CollTB3.Add(Obliquite3)
            CollTB3.Add(Rotation1_3)
            CollTB3.Add(Rotation2_3)
            CollTB3.Add(Rotation3_3)
            CollTB3.Add(Sacral3)
            CollTB3.Add(Bascule3)
            CollTB3.Add(BasculeT3)
            Dim CollR1 As New Collection
            CollR1.Add(Results.Cobb1_21)
            CollR1.Add(Results.Cobb2_21)
            CollR1.Add(Results.Cobb3_21)
            CollR1.Add(Results.Cyphose21)
            CollR1.Add(Results.Lordose21)
            CollR1.Add(Results.InciPelv21)
            CollR1.Add(Results.VersionPelv21)
            CollR1.Add(Results.PenteSacree21)
            CollR1.Add(Results.Obliquite21)
            CollR1.Add(Results.Rotation1_21)
            CollR1.Add(Results.Rotation2_21)
            CollR1.Add(Results.Rotation3_21)
            CollR1.Add(Results.Sacral21)
            CollR1.Add(Results.Bascule21)
            CollR1.Add(Results.BasculeT21)
            Dim CollR2 As New Collection
            CollR2.Add(Results.Cobb1_31)
            CollR2.Add(Results.Cobb2_31)
            CollR2.Add(Results.Cobb3_31)
            CollR2.Add(Results.Cyphose31)
            CollR2.Add(Results.Lordose31)
            CollR2.Add(Results.InciPelv31)
            CollR2.Add(Results.VersionPelv31)
            CollR2.Add(Results.PenteSacree31)
            CollR2.Add(Results.Obliquite31)
            CollR2.Add(Results.Rotation1_31)
            CollR2.Add(Results.Rotation2_31)
            CollR2.Add(Results.Rotation3_31)
            CollR2.Add(Results.Sacral31)
            CollR2.Add(Results.Bascule31)
            CollR2.Add(Results.BasculeT31)
    Chaque collection est dans un container, malheureusement j'ai déplacé les fenêtres plusieurs fois, et je n'ai aucun moyen à ma connaissance de connaitre leur index dans GroupBox1.Controls par exemple (si vous le savez, je suis preneur !)

    J'avais bien pensé à faire quelque chose du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim x as TextBox
    For Each ctl As Control in GroupBox1.Controls
    If TypeOf ctl is TextBox
    x = ctl
    x.Text = blabla
    End If
    Next
    mais d'une part, je suis obligé de faire le Dim x as TextBox et x=ctl (je n'ai jamais compris pourquoi ?) et d'autre part, on revient au problème ci-dessus : je ne sais pas quelle est l'indice de chaque control qui m'intéresse dans la collection.

    Je vais voir pour les solutions que vous proposez. Merci !

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Par défaut
    J'ai remplacé les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim CollCB As New Collection
    par des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim CollCB As New List(Of CheckBox)
    et faire aller mon index de 0 à CollCB.Count - 1 (au lieu de 1 à CollCB.Count) et effectivement, ça fonctionne. Je n'avais plus qu'à mettre mes strings dans des CDbl() pour le calcul et l'option Strict ne me fait plus d'erreur.

    Merci beaucoup !

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

Discussions similaires

  1. ddl com et Late binding
    Par Dadou74 dans le forum VB 6 et antérieur
    Réponses: 25
    Dernier message: 28/06/2011, 09h32
  2. Pb late binding - Creation d'un rendez-vous Outlook
    Par gpinson dans le forum Général VBA
    Réponses: 1
    Dernier message: 31/01/2011, 20h19
  3. Problème late binding avec Word et Outlook
    Par sibama dans le forum VB.NET
    Réponses: 4
    Dernier message: 06/12/2009, 21h24
  4. Late binding et Objets COM
    Par M4tthieu dans le forum C#
    Réponses: 4
    Dernier message: 07/08/2007, 12h28
  5. [C#, .NET 1.1]Ouvrir un classeur excel en late binding
    Par tontonplaisir dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/06/2007, 10h54

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