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

C# Discussion :

[VS2005][C#] panel add Controls


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut [VS2005][C#] panel add Controls
    Bonsoir

    j'ai un petit problème bizarre avec vs2005.
    je fais une form "form1" avec un panel "panel1" et un button "button1"
    ensuite je crée une autre form "form2" avec qques controles: labels, buttons, listbox,... (peu importe)
    je crée une action associé au button1 qui crée une instance de "form2" et je veux importer les controles de form2 dans le panel1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Form2 t = new Form2();
    MessageBox.Show(t.Controls.Count.ToString());
     
    foreach (Control var in t.Controls)
    {
        this.panel1.Controls.Add(var);
    }
    Label l = new Label();
    l.Text = "testing label !!!";
    this.panel1.Controls.Add(l);
    ce qui est bizarre:
    - le nb de controle de form2 est cohérent
    - l'ajout des contorles dans panel1 est problématique!! les labels ne semblent pas être ajoutés !?
    - le label crée à la fin est quant à lui bien ajouté !!!

    qqun pourrait m'expliquer?

    Merci

  2. #2
    DrQ
    DrQ est déconnecté
    Membre expérimenté
    Avatar de DrQ
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 388
    Points : 1 515
    Points
    1 515
    Par défaut
    Ah mon avis cela vient du fait qu'un contrôle ne peut appartenir qu'à un seul conteneur.
    Faisant déjà parti de ton formulaire le contrôle ne peut être mis sur le panel.
    1)http://www.developpez.com/cours/
    2)Recherche
    3)Posez votre question en suivant les règles
    _oOo-DrQ-oOo_

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut
    euh pas sûr...
    en fait il ajoute certains controles mais pas tous. et ce n'est pas tjs les mêmes.
    d'autres part les controles de form2 ne sont pas dans un conteneur spécifique, juste dans la form.

    sinon ce que je souhaite faire c'est de pouvoir designer la "main frame" de mon GUI dans des winforms et puis les importer dans le main panel de mon application. Vous avez pê mieux à proposer?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut
    ps: un modérateur pourrait-il bouger ce post dans la partie winforms.
    pps: merci Morpheus
    ppps: sorry de m'être trompé de section

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    essayes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Form2 t = new Form2();
    MessageBox.Show(t.Controls.Count.ToString());
    Control c;    
    foreach (Control var in t.Controls)
    {
      c = var;
      t.Controls.Remove(var)
      this.panel1.Controls.Add(c);
    }
    Label l = new Label();
    l.Text = "testing label !!!";
    this.panel1.Controls.Add(l);
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut
    pas mieux :'(

    mais chez toi ça marche ?
    essaye juste avec une form2 où tu as mis par ci par là qques controles: bouttons, text, labels, listbox, ....
    (enfin si tu as vs2005)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut
    bon j'ai une "solution"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MessageBox.Show(t.Controls.Count.ToString());
    Control[] a = new Control[t.Controls.Count];
    t.Controls.CopyTo(a, 0);
    this.panel1.Controls.AddRange(a);
    ca semble bien passer mais j'avoue que je ne saisis pas trop. il semblerait bien qu'un controle ne puisse avoir qu'un parent mais bon... en 1.1 ça le faisait pas (je pense)

    sinon je suis tjs preneur d'une solution plus élégante. ou d'un clonage plus propre ?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut
    bon par acquis de conscience je suis allé retrouvé mon code .net 1.1 et...euh.. j'ai fait un minuscule petit erreur :
    en fait j'ajoutais un usercontrol à mon panel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.panel1.add(new UserControl1());
    et là, logiquement, tout se passe bien.

    Bref pour résoudre mon problème de "design graphique":
    - soit je designe tout dans un user control, puis je ajoute l'usercontrol dans un panel
    - soit je copy tous les controles d'une form puis je les ajoute au panel
    - soit je lis les best practice du "Composant UI application block" (http://www.gotdotnet.com/codegallery/codegallery.aspx?id=22f72167-af95-44ce-a6ca-f2eafbf2653c)
    - soit il y a encore une autre solution ?

    je mets résolu mais je reste ouvert à vos propositions.
    (je peux détailler mon problème si vous ne l'avez déjà bien saisi )

  9. #9
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Pour faire ça il faut impérativement parcourir la collection de la fin vers le début... Et là ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Form2 t = new Form2();
     
    Control c;
     
    for (int i = t.Controls.Count - 1; i >= 0; i--)
    {
      c = t.Controls[i];
      MessageBox.Show(c.Name);
      t.Controls.Remove(c);
      this.panel1.Controls.Add(c);
    }
    @+

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut
    euh.. merci !
    mais j'avoue que ça ressemble presque à de la magie là !

    qqun aurait une explication "technique" ou alors juste du vaudou

  11. #11
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Ca me paraît logique de parcourir la collection dans le sens inverse lorsqu'on est amené à supprimer des éléments de cette collection...

    Bon, je me lance pour des explications, mais je ne suis pas certain que ça ce passe réellement comme ça... Si quelqu'un peut confirmer/infirmer ?!?!!

    Si tu as par exemple 3 contrôles dans la collection, et que tu parcours dans le sens "normal" :
    - dans la première boucle, tu te positionnes sur le premier contrôle, que tu supprimes dans la boucle.
    => le deuxième devient donc le premier dans la collection, et le troisième devient deuxième.
    - au passage suivant, il va se positionner sur le deuxième controle, mais comme la collection a été "tassée" le deuxième dans cette boucle était en fait troisième lors du premier passage => le "vrai" deuxième est perdu...


    Ca expliquerait le fait que, dans l'exemple de neguib, si je place 4 controles dans form2, seuls les controles 1 et 3 sont copiés dans le panel1 de la form1.

    @+

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut
    oups merci j'avais passé le remove...
    tjs ce problème de modification concurrente des collections
    ça explique aussi pourquoi le copyTo fonctionne sans problème

    par contre je ne vois pas pourquoi la première méthode ne marche pas.
    j'ai même essayer de remplacer le this.panel1.controls.add(var) par var.Parent = this.panel1 (mais ça ne marche pas mieux)

    en tout cas merci pour votre aide à tous

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

Discussions similaires

  1. Soucis avec panel, ses controls et les événements
    Par Arno_94 dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 06/08/2008, 12h25
  2. [VS2005] Changer dynamiquement de Controle Utilisateur
    Par pape0 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 19/01/2008, 15h22
  3. panel et controles
    Par clod83 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/12/2007, 20h16
  4. Réponses: 6
    Dernier message: 16/08/2006, 20h04
  5. [C#][VS2005]datagridview accéder au controle d'une cellule
    Par camilero dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/06/2006, 11h40

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