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 :

Copier des controles sur une autre page d'un tabpage


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut Copier des controles sur une autre page d'un tabpage
    Bonjour,
    J'ai un tabPage avec des controles (textBox, label, comboBox, richTextBox) et leurs méthodes associées sur la tabpage1, je veux copier par code tous ces controles sur tabpage2
    Quand j'implémente:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            foreach (Control c in tabPage1.Controls)
                {
                    Object c2 = c;
                   tabPage2.Controls.Add((Control)c2); 
                }
    Il me déplace la moitié environ des controles sur la tabpage2 , dénudant à moitié la tabpage1, au lieu de tous les copier. Pourquoi?

  2. #2
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    En fait, lorsque tu fais
    tu ne "dupliques" pas l'objet, mais tu copies sa référence, et donc lorsque tu ajoutes cette références comme contrôle de TabPage2, tu déplaces l'objet. Puisqu'un contrôle ne peut avoir qu'un seul parent.

    Pour le reste, pourquoi veux-tu faire ce genre de manipulation ?

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut suite
    J'ai un tabpage avec 12 pages (tabpage0,tabpage1...etc).
    La tabpage0 contient une dizaine de controles, pareil pour les autres, je ne voulais pas en installer 120 manuellement...
    Jaurais pu mettre une form1, et 12 fois Formi=new Form() mais je voulais les onglets.
    1)Comment fait-on pour dupliquer un objet, et pas seulement sa référence?
    2)Pourquoi seulement une partie des controles a été transférée de tappage0 à tabpage1

  4. #4
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    En fait, si toutes les pages comportes les mêmes contrôles, le plus simple et de créer un UserControl qui correspond au contenu de ce que tu souhaites mettre dans ta Tabpage, puis d'ajouter ce UserControl aux différentes pages.

    1) S'il implémente l'interface ICloneable, il faut appeler la méthode Clone(), sinon, il faut créer un nouvel objet du même type, et copier les valeurs à la main (en faisant attention aux propriétés qui sont elle-mêmes des références !)

    2) C'est difficile à dire sans voir le code pour chercher l'explication..

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut suite
    J'ai essayé Clone() mais même avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (c is TextBox) c2=c.Clone()
    il envoie un message d'erreur à la compilation

  6. #6
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut
    Je suis de l'avis de Pongten, mais si tu veux vraiment dupliquer tous tes controles; on peut essayer quelque chose du genre :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    foreach (Control c in tabPage1.Controls)
    {
        Type t = c.GetType();
        object _control = Activator.CreateInstance(t);
     
        foreach (PropertyInfo pi in c.GetType().GetProperties())
        {
            _control.GetType().GetProperty(pi.Name).SetValue(_control, pi.GetValue(c, null), null);
        }
        tabPage2.Controls.Add(_control);
     }

    Je n'ai pas testé, je ne suis pas sûre que le GetValue et SetValue fonctionnent pour les controles

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut suite
    Erreurs de compilations
    non reconnu

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabPage2.Controls.Add(_control);
    arguments non valides

  8. #8
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut
    A part copier coller ce qu'on te suggère, tu fais quelque chose ?
    En plus, quand on dit "quelque chose du genre", ça veut dire qu'il faut adapter pour son utilisation

    Enfin je sais pas, mais une erreur de compilation "PropertyInfo non reconnu", suffit de lire la description complète pour voir qu'il suffit d'ajouter une référence et un using dans ton projet

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 153
    Points : 161
    Points
    161
    Par défaut
    A mon avis tu devrais regarder du cote des User Control... si tes deux onglets ont a peu près la même fonction et le même aspect, ça me semble être la solution la plus appropriée...

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut suite
    Merci pour le conseil UserControl qui m'a permis d'avancer.

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    J'aurais pu mettre une form1, et 12 fois Formi=new Form() mais je voulais les onglets.
    Il existe une solution simple :

    • mettre à la conception tous les controls de Form1 dans un "MainPanel" (propriété Dock=Fill et Modifiers=Internal)
    • En exécution, à l'init de Form1, faire 12 fois les opérations suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Form1 tempForm1 = new Form1() ;
    tempForm1.MainPanel.Parent = MyTabControl.TabPage[i] ;

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut suite
    Bonjour
    1) j'ai créé un usercontrol, qui se reproduit 21 fois sur la form1. (21 tabpages)
    Un bouton sur userControl doit appeler une méthode CreerGraphique définie sur form1. (En fait il y a 21 boutons avec des parametres diférents)
    Comment faire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
           private void button1_Click(object sender, EventArgs e)
            {
                CreerGraphique(parametre défini sur Form1); 
            }
    2)Plus généralement soit deux forms, Form1 et Form2, je n'arrive pas à communiquer de l'une à l'autre.
    Si j'instancie f2 dans Form1,et j'instancie f1 dans Form2 j'obtiens une boucle infinie
    Alors comment appeler leurs champs et méthodes respectives.
    Merci de vos lumières

  13. #13
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    pour accéder aux controls et fonctions de formA dans formB :
    • pour les controls, mettre la propriété "Modifiers" des controls à "Internal".
    • pour les fonctions (ou les events), les déclarer "internal" au lieu de "private".

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut suite
    Pour moi internal ne marche pas. J'ai tout mis en internal (tout les codes et
    tabcontrol, l'userControl pas possible la propriété est absente)
    si s est un string de form2, je n'arrive pas à lui donner la valeur d'un champ
    du controle tabControl1 de form1, car il faut instancier form1 dans form2

  15. #15
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Mettre le tabcontrol en intenal ne propage pas cette propriété sur les controls enfants (tabPage, textbox, etc) inclus dans le tabconrol.

    Si on passe l'instance de Form1 à l'instance de Form2 lors (ou juste après) la création de Form2), on pourra accéder depuis Form2 aux variables et contrôles de Form1 définies comme "internal".

  16. #16
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut suite
    vraiment désolé.
    Je ne comprend pas la deuxième phrase...
    De plus Form1 évolue (exemple: richTextBox, ou ComboBox affichent des strings), si après avoir instancié Form2, j'instancie form1, je perd mes données strings....

  17. #17
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Dans Form1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    internal class Form2 MyForm2 ;
    ...
    MyForm2=new Form2() ;
    MyForm2.MyForm1=this ;
    MyForm2.Show() ;
    Dans Form2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    internal class Form1 MyForm1 ;
    ...
    MessageBox.Show(MyForm1.MyTextBox1.Text) ;

  18. #18
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut suite
    Je ne comprend pas ce morceau de code.

  19. #19
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Dans la classe Form1, "this" représente l'objet Form1 instancié.

  20. #20
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Points : 0
    Points
    0
    Par défaut suite
    Oui cela je le savais
    Mais mon compilateur refuse ton premier membre

Discussions similaires

  1. trier et copier des données sur une autre feuille excel
    Par mirage37 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/07/2012, 17h08
  2. ajouter des controles sur une autre form
    Par kineton dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/10/2009, 10h32
  3. Excel-copier des lignes sur une autre feuille
    Par petecul dans le forum Excel
    Réponses: 7
    Dernier message: 13/09/2007, 02h56
  4. Réponses: 2
    Dernier message: 28/11/2006, 15h20
  5. [C#2.0]Dupliquer des controles sur une autre form
    Par chnew dans le forum Windows Forms
    Réponses: 5
    Dernier message: 12/05/2006, 09h05

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