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 :

Récupérer tous les objets d'une application


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut Récupérer tous les objets d'une application
    Bonjour,

    Je voudrais remplir ma table d'objets avec tous les objets de mon appli.

    Objet_Id | Objet_Nom | Objet_Type

    Dans un memu admin, je voudrai pouvoir afficher sous forme de TreeView la totalité de mes objets (nom et type).

    Tous les forms et ce qu'il y a dedans.
    Form1
    Objet1 (label)
    BackColor
    ForeColor
    Objet2 (Button)
    Visible

    C'est l'admin qui donne lui même les noms des propriétés qu'il veut modifier.

    J'ai une table

    Objet_Id | Profil | Propriete_Nom | Autorisation (bool) | Valeur
    exemple :

    Bt_Quitter | Consultant | BackColor |true | 255
    Si l'utilisateur est admin il aura comme couleur de fond pour le bouton quitter rouge.

    Et dans le code :

    On va chercher les donner dans la base

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NomDeObjet.NomPropriété = Valeur
    Je vous explique tous ça pour que vous voyez pourquoi je me complique la vie!

    Je cherche donc un moyen de récupérer les noms et type de tous mes objets.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 166
    Points : 12 284
    Points
    12 284
    Par défaut
    Vous avez prévu quoi comme SGBD, parce que là, il va prendre chère en requêtes totalement inutiles.

  3. #3
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Une fonction récursive sur les propriétés Controls de la form et des autres conteneur.

    En gros, elle va parcourir la propriété Controls de la forme et si le control courant à une propriété Controls, elle va la parcourir aussi.

    Ensuite, pour le nom et le type, pas compliqué via la propriété Name et la méthode GetType().

  4. #4
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    J'ai fais ça mais je ne prends en compte que les controles de la classe dans laquelle je suis.

    Comment je fais pour parcourir tous les forms (qu'ils soient instancier ou non)?

    J'ai trouver quelque chose sur mon problème mais je ne comprend pas grand chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            private void ListeObjets()
            {
                foreach (Control oControl in this.Controls)
                {
                    string sql = "AjoutObjet '" + oControl.Name + "','" + oControl.GetType().ToString() + "'";
                    SqlConnection ConsultConnection = new SqlConnection(oSurveillant.strConnexionSecurite);
                    SqlCommand Command = new SqlCommand(sql, ConsultConnection);
     
                    Command.Connection.Open();
                    Command.ExecuteNonQuery();
                    Command.Connection.Close();
                }
            }

  5. #5
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Tu dois les lister à chaque fois que ton application se lance ou une seule fois ?

    Dans le premier cas, passe par de la réflexion, tu prends l'assembly courante et tu regarde tout les types pour ne prendre que les formulaires. Et pour chaque formulaire, tu parcours ses contrôles.

    Dans le deuxième cas, tu peux le faire à la main
    Sinon tu peux utiliser un parseur C# pour lire les fichiers .cs de ton projet.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 119
    Points
    25 119
    Par défaut
    en passant par la reflection, il faut instancier les form pour pouvoir voir la liste des controles
    certains forms nécessite des paramètre en cas de constructeur paramétré, donc pas forcément évident avec de la reflection
    et puis il peut y avoir des controles ajoutés pendant l'exécution qui ne seront alors pas listés

  7. #7
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    En fait, il faudrait pouvoir le faire à chaque fois que l'on modifie l'appli pour y updater les modif.

    Il me faut donc bien une fonction.

    Pas évidant mon truc...

  8. #8
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Tu souhaite faire cela pour pouvoir modifier l'apparence du logiciel selon les rôles ?

    Faut-il qu'il soit entièrement paramétrable ?

    Parce-que là, comme le dit Pol63, ça risque d'être un brin complexe...

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 119
    Points
    25 119
    Par défaut
    y a t il des ajouts de controles pendant l'exécution ? si oui doivent ils être pris en compte ?

  10. #10
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    C'est pour changer l'apparence sans toucher au code mais aussi pour permettre la traduction du texte.

    Lbl_Bonjour | ConsultantAnglais | Text |true | Good Morning
    Pour le profil ConsultantAnglais il faut changer le texte du label et le mettre à Good Morning.

    Je rend des controls visibles ou enabled mais il n'y a pas d'ajout.

    -------------------

    Ah! A par peut être les noms des colonnes de mes DatGridView.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 119
    Points
    25 119
    Par défaut
    dans ce cas, un parsing des fichiers designer.cs est peut etre le plus simple
    après avoir fini de coder une version, tu passes une moulinette qui lit les fichiers designer.cs de ton projet
    tu as plus qu'à regarder ce qu'il y a écrit dans le fichier designer pour écrire la moulinette (la clé pouvant être NomForm.NomControle)

  12. #12
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Citation Envoyé par Chacha35 Voir le message
    Ah! A par peut être les noms des colonnes de mes DatGridView.
    Il te faut aussi répertorier les colonnes des DataGridView pour modifier leur apparence ?

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Tu devras obligatoirement instancier tout tes forms pour récupérer les controls .... ce qui est possible de cette manière.

    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
     
    Assembly asm = Assembly.GetExecutingAssembly();
    // Parcours de tous les types de l'assembly
    foreach (Type t in asm.GetTypes())
    {
    // Il s'agit d'une form
    if (t.BaseType == typeof(Form))
    {
    Form f = (Form)Activator.CreateInstance(t);
    foreach(Control c in f.Controls)
    {
    parcourControl(c)
    }
    }
    }
    Procédure parcourant les controls
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void parcourControl(Control c)
    {
    foreach(Control c1 in c.Controls)
    {
    //AJOUT DANS LA BASE 
    if(c1.Controls.Count != 0)
    {
    parcourControl(c1);
    }
    }
    }
    Voilà je pense que cette méthode peut fonctionner.

    Bonne continuation.

  14. #14
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    Oui, il me faut les noms de colonnes pour pouvoir les traduire.

    Je vais tenter la méthode de hotsizzle.

    Merci à tous.

  15. #15
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Il te manquera toujours les noms des colonnes...

  16. #16
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    Ouai, mais si déjà le reste marche ça sera pas mal!

    Il compile mais il y a une erreur.

    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
            private void Bt_Upload_Click(object sender, EventArgs e)
            {
                Assembly asm = Assembly.GetExecutingAssembly();
                // Parcours de tous les types de l'assembly
                foreach (Type t in asm.GetTypes())
                {
                    // Il s'agit d'une form
                    if (t.BaseType == typeof(Form))
                    {
    //Le constructeur sur le type 'Consultationbis.F_ConsultRef' est introuvable.
                        Form f = (Form)Activator.CreateInstance(t,oSurveillant);
                        foreach (Control c in f.Controls)
                        {
                            parcourControl(c);
                        }
                    }
                }
            }
    C'est peut-être du au fait que je donne comme paramètre dans l'instanciation de ce form, en plus du nom du contexte, un booléen.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ConsultRef = new F_ConsultRef(oSurveillant, false);

  17. #17
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Si tu veux lister les colonnes de tes grids tu rajoutes juste un contrôle du type dans la procédure parcourControl et si c'est un datagridview tu boucle sur les collones avec un foreach.... enfin si tes colonnes sont bien definies dans le fichier designer bien sur.

  18. #18
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    Et bien non. Je rempli mes DataGridView avec une DataTable puis je renomme les colonnes dans le code.

  19. #19
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Pour l'instanciation, rajoute le booléen dans les paramètres de la méthode, sinon il pourra pas instancier ta form.

  20. #20
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Oui alors soit tu gères les paramètres de tes forms en passant un tableau d'objet à la méthode CreateInstance(), soit tu créés un constructeur pour chacun de tes forms qui ne prend aucun paramètre et qui initialise juste les composants de ton form (InitializeComponent()).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/06/2011, 15h05
  2. BDC récupérer tous les items d'une application depuis le code
    Par tigrou2405 dans le forum Développement Sharepoint
    Réponses: 1
    Dernier message: 20/01/2011, 15h37
  3. [RegEx] Récupérer tous les liens d'une page
    Par micatmidog dans le forum Langage
    Réponses: 13
    Dernier message: 03/11/2006, 01h37
  4. Récupérer tous les handles d'une application choisie
    Par dacid dans le forum API, COM et SDKs
    Réponses: 13
    Dernier message: 21/04/2006, 16h24
  5. Réponses: 7
    Dernier message: 08/01/2005, 13h24

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