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

Windows Forms Discussion :

Erreur : Unable to cast object of type 'System.Windows.Forms.TableLayoutPanel' to typ


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut Erreur : Unable to cast object of type 'System.Windows.Forms.TableLayoutPanel' to typ
    Bonjour,

    J'ai une liste de labels dans un table layout panel. Je souhaiterais les remplir avec les données d'un tableau.
    Pour cela j'ai donc fait un for each qui les parcoure tous un à un pour les remplir.

    Voici mon code : (lst_libelleQst est nom de mon tableau)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For Each label As Label In tlpPrincipal.Controls
    	label.Text= lst_libelleQst(i)
    	i=i+1
    Next
    Seulement, j'ai une erreur que je ne comprends pas a un certain moment de ma boucle :
    Exception System.InvalidCastException was thrown in debuggee:
    Unable to cast object of type 'System.Windows.Forms.TableLayoutPanel' to type 'System.Windows.Forms.Label'.
    Si quelqu'un pourrait m'aider, merci d'avance

  2. #2
    Membre régulier Avatar de stdebordeau
    Homme Profil pro
    Statisticien
    Inscrit en
    Septembre 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 241
    Points : 120
    Points
    120
    Par défaut
    cette boucle semble le forcer à convertir tous les controles en label.
    essai plutot ça et dit moi si ça marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each label In tlpPrincipal.Controls
     
    if label.getType.ToString = "label" then
    	label.Text= lst_libelleQst(i)
    	i=i+1
    end if
     
    Next

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    c'est loin d'être très propre label.getType.ToString = "label"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    For Each ctrl As Control In tlpPrincipal.Controls
        If Not TypeOf ctrl is Label Then Continue For
     
        DirectCast(ctrl,Label).Text =  lst_libelleQst(i)
        i=i+1
    Next
    (avec un peu de chance la propriété Text appartient à la classe Control et le DirectCast ne serait donc pas obligatoire)

  4. #4
    Membre régulier Avatar de stdebordeau
    Homme Profil pro
    Statisticien
    Inscrit en
    Septembre 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 241
    Points : 120
    Points
    120
    Par défaut
    pourrais tu m'expliquer les dessous de la chose. pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    label.getType.ToString = "label"
    ne marche pas. merci

  5. #5
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Parce que la représentation sous forme d'une chaîne d'un type fait apparaître l'espace de noms dans lequel est déclaré le type. Pour un Label on aurait System.Windows.Forms.Label.

    Mais comme l'a indiqué sperot ce n'est pas propre car il existe tout ce qu'il faut pour tester les types sans avoir à passer par la chaîne de caractères correspondant au nom du type. Cette dernière solution apportant son lot de bugs divers et variés

    Le code serait plutôt celui-ci par contre
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Each ctrl As Control In tlpPrincipal.Controls
        If ctrl is Label Then 
            DirectCast(ctrl,Label).Text =  lst_libelleQst(i)
            i=i+1
        End If
    Next

  6. #6
    Membre régulier Avatar de stdebordeau
    Homme Profil pro
    Statisticien
    Inscrit en
    Septembre 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 241
    Points : 120
    Points
    120
    Par défaut
    Parce que la représentation sous forme d'une chaîne d'un type fait apparaître l'espace de noms dans lequel est déclaré le type. Pour un Label on aurait System.Windows.Forms.Label
    car il existe tout ce qu'il faut pour tester les types sans avoir à passer par la chaîne de caractères correspondant au nom du type
    C'est tout à fait claire. merci pour l'explication.

    cependant je ne comprend pas pourquoi tu effectue la conversion en label avec directcast sachant que la condition d'entré dans la boucle est justement que le controle soit un label

  7. #7
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Parce que l'on boucle sur des contrôles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each ctrl As Control In tlpPrincipal.Controls
    ...
    Next
    et si un label est un contrôle, un contrôle n'est pas forcément un label

    D'un autre côté, la propriété Text étant définie sur la classe Control on pourrait effectivement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Each ctrl As Control In tlpPrincipal.Controls
        If ctrl is Label Then 
            ctrl.Text =  lst_libelleQst(i)
            i = i + 1
        End If
    Next
    du moment que l'on utilise rien que ne soit spécifique à Label.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    s'il a une erreur de conversion c'est bien parce qu'il a posé autre chose qu'un label sur son tlpPrincipal

    controls contient les controls enfants (labels, boutons et autre)

    donc il faut tester le type et quand c'est le bon on peut le caster pour avoir l'intellisense

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Merci bcp pour toutes vos réponses.

    En effet, j'ai remarqué que mon erreur venait du fait que dans mon table LayoutPanel je n'avait pas que des label et que du coup il essayait de convertir un control en label.

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par StormimOn Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Each ctrl As Control In tlpPrincipal.Controls
        If ctrl is Label Then 
            ctrl.Text =  lst_libelleQst(i)
            i = i + 1
        End If
    Next
    En fait ce code ne marche pas, j'ai l'erreur : "label" is a type and cannot be used as an expression

  11. #11
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est parce que j'ai écrit ça trop vite. Je fais du C# à la base (VB me donne des boutons ).

    Mais en regardant le post un peu plus haut, tu aurais pu corriger par toi même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Each ctrl As Control In tlpPrincipal.Controls
        If TypeOf ctrl Is Label Then 
            ctrl.Text =  lst_libelleQst(i)
            i = i + 1
        End If
    Next

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Ah dsl...je savais pas.

    Mais maintenant c'est bon ca marche. Merci bcp!

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 01/10/2013, 11h32
  2. Réponses: 11
    Dernier message: 09/08/2012, 10h02
  3. Unable to cast object of type "System.Windows.Application"
    Par OminiuS dans le forum Silverlight
    Réponses: 11
    Dernier message: 15/09/2010, 16h28
  4. Réponses: 4
    Dernier message: 14/10/2009, 16h16
  5. public class Form1 : System.Windows.Forms.Form
    Par lion000 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 05/05/2007, 17h20

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