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 :

Acces au datagridview d'une autre forme et ou retour methode avec contenu du datagridView [Débutant]


Sujet :

C#

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut Acces au datagridview d'une autre forme et ou retour methode avec contenu du datagridView
    Bonjour

    j'ai sur une form1 un datagridView.

    Pour le charger j'ai fait une classe (pas la classe de la form1) où se trouve cette méthode
    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
        public void MiseAJourListServeurs(DataGridView Dtgv, string fileName)
        {
            maConnexion = new SQLiteConnection("Data Source=" + fileName + ";Version=3;");
            maConnexion.Open();
     
            SQLiteCommand comm = new SQLiteCommand("Select * From serveurs order by Description", maConnexion);
            using (SQLiteDataReader read = comm.ExecuteReader())
            {
                while (read.Read())
                {
                    Dtgv.Rows.Add(new object[] {                    
                        read["Description"],
                        read["HostName"],
                        read["PortFTP"].ToString(),
                        read["portTCP"].ToString(),
                        read["LogIn"],
                        read["cryptage"],
                        read["Idserveur"]
                        });
                }
            }
            maConnexion.Close();
        }
    Je passe à la méthode le chemin vers une base de données et le datagridview à mettre à jour. Ça me permet d'accéder à ce datagridView depuis la nouvelle classe...

    Problème, si je veux déclencher cette méthode depuis une autre form (Form2) je ne sais pas passer la référence du datagridview puisque celui ci n'est pas visible depuis form2 malgré que je l'ai passé en public dans form1 :-(
    Du coup Comment puis je accéder à mon datagridView depuis la class à part ou depuis form2 ? Je me rends compte que de passer le datagridview en paramètre n’était pas bien élégant.

    Il semblerait que je puisse passer le datagridview en paramètre du constructeur de la seconde form mais ça me parait un peu tiré par les cheveux...

    Merci par avance pour votre éclairage
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    bonjour,

    Le passage de ton DGV en paramètre dans le constructeur de ton form2 ne ferait-il pas l affaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    private Datagridview m_Dgv{ get; set;}
     
    public Form2(Datagridview Dgv)
    {
        InitializeComponent();
        m_Dgv = Dgv;
    }
    a+

  3. #3
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut
    Bonjour

    En fait hier je suis arrivé à faire le job en passant le datagridview en paramètre à form2 mais j'ai fini par poster ici ma question ayant le sentiment que c’était une solution pas très "normale"

    c'est une pratique bonne et normale de faire comme ça en fait ?


    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    en fait lorsqu un projet bien concu est constitué de classes instanciables (form2 etant une classe) c est en effet une bonne pratique. Mais je ne connais pas le perimetre de ton projet donc.....

    a+

  5. #5
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut
    Tous les projets que j'ai fait jusqu'à maintenant entassaient presque tout dans le form1, la classe de base.
    Je tente de sortir de ce mode "programmation minable" pour gagner en lisibilité au niveau programmation, faire des choses plus ergonomiques pour l'utilisateur, gagner en fiabilité (avec un code plus structuré)
    mais si le msdn répond à toutes les questions précises il n'est pas simple de comprendre les bonnes pratiques
    donc merci de m'avoir répondu déjà !

    Là je tente de programmer intelligemment en mettant dans des classes ce qui peut se rattacher à un "objet" c'est à dire pour moi tout ce qui se rattache à des calculs métier, à un sujet de traitement particulier ou au traitement d'un composants clé dans une form tel qu'un datagridview qui contient les données qui intéressent l'utilisateur. Si je comprends a peu près bien la notion de classe et d'objet aujourd'hui j'ai beaucoup de mal à comprendre comment structurer les liens entre les classes (en tête de liste les interactions avec les éléments des forms)

    Donc si je comprends bien : le fait de passer en paramètres au constructeur d'une classe les objets dont elle peut avoir besoin permet d'instancier grâce à cette classe un objet qui connait un autre objet ?

    si dans form1 je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form2 maform2 = new Form2(monObjet,monAutreobjet)
    alors je peux modifier ou appeler monObjet ou monAutreObjet

    et c'est la bonne manière de faire ?

    cool


    Petite question subsidiaire
    dans ce code fourni plus haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private Datagridview m_Dgv{ get; set;}
     
    public Form2(Datagridview Dgv)
    {
        InitializeComponent();
        m_Dgv = Dgv;
    }
    A quoi sert le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Datagridview m_Dgv{ get; set;}
    Si je ne me trompe pas c'est une propriété de l'objet Form2 que l'on peut donc lire ou écrire depuis le parent de l'objet. a quo ica sert de créer une telle propriété et de l'initialiser dans le constructeur avec le paramètre passé au constructeur ?
    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  6. #6
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par petitours Voir le message
    Tous les projets que j'ai fait jusqu'à maintenant entassaient presque tout dans le form1, la classe de base.
    Je tente de sortir de ce mode "programmation minable" pour gagner en lisibilité au niveau programmation, faire des choses plus ergonomiques pour l'utilisateur, gagner en fiabilité (avec un code plus structuré)
    Et c'est tout à ton honneur


    Citation Envoyé par petitours Voir le message
    Là je tente de programmer intelligemment en mettant dans des classes ce qui peut se rattacher à un "objet" c'est à dire pour moi tout ce qui se rattache à des calculs métier, à un sujet de traitement particulier ou au traitement d'un composants clé dans une form tel qu'un datagridview qui contient les données qui intéressent l'utilisateur. Si je comprends a peu près bien la notion de classe et d'objet aujourd'hui j'ai beaucoup de mal à comprendre comment structurer les liens entre les classes (en tête de liste les interactions avec les éléments des forms)
    C'est pourquoi il est avant tout recommandé de bien conceptualiser/structurer un projet : textuellement cela permet de faire ressortir des termes qui viendront poser les fondations (l'ossature) :

    - cela permet dans ton explorateur de solutions de créer des dossiers qui pourraient correspondre à des espaces de noms, les plus communs à divers projets (cela dépends du domaine) : Helpers, Core, Extensions, Settings, ...etc.....
    - en relisant bien la description de certaines fonctionnalités, tu pourras les regrouper et ainsi définir certains noms de classes. Des classes qui seraient susceptibles de porter le même nom avec des termes communs qui les décrivent sous entendraient la notion d'héritage...etc.....

    Bien évidement toute cette phase peut être amenée au moyen de certaines méthodes bien connues : cartes CRC, UML, ....etc...


    Citation Envoyé par petitours Voir le message
    Donc si je comprends bien : le fait de passer en paramètres au constructeur d'une classe les objets dont elle peut avoir besoin permet d'instancier grâce à cette classe un objet qui connait un autre objet ?
    Non cela n'instancie pas l'objet que tu passes en paramètre. Cela permets d'obtenir une référence de l'objet dont tu auras besoin.

    Citation Envoyé par petitours Voir le message
    si dans form1 je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form2 maform2 = new Form2(monObjet,monAutreobjet)
    alors je peux modifier ou appeler monObjet ou monAutreObjet

    et c'est la bonne manière de faire ?

    cool

    C'est une notion basique en POO, avec ton code tu viens d'obtenir une instance de form2 nommée maform2 mais tu ne pourras pas accéder à monobjet et monautreobjet (ex : maform2.monobjet ou maform2.monAutreobjet) puisque tu n'as pas créés de propriétés avec attribut Public (ce qui réponds à ta prochaine question. )
    De plus imaginons que tu comptes accéder à la référence monObjet ou monAutreObjet dans ton Form2 (ta classe de base), tu ne pourras pas puisque tu n'as pas de propriété déclarée avec une portée de classe (Form2) !


    Citation Envoyé par petitours Voir le message
    Petite question subsidiaire
    dans ce code fourni plus haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private Datagridview m_Dgv{ get; set;}
     
    public Form2(Datagridview Dgv)
    {
        InitializeComponent();
        m_Dgv = Dgv;
    }
    A quoi sert le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Datagridview m_Dgv{ get; set;}
    Si je ne me trompe pas c'est une propriété de l'objet Form2 que l'on peut donc lire ou écrire depuis le parent de l'objet. a quo ica sert de créer une telle propriété et de l'initialiser dans le constructeur avec le paramètre passé au constructeur ?
    Merci
    Comme évoqué plus haut, c'est effectivement une propriété avec une portée de classe (Form2), imaginons que tu souhaites effectuer un traitement sur ton datagridview, modifier un row ou autre... qui requiert une modification instantanée avant de retourner sur le form appelant (ex : Form1), tu ne vas pas mettre ton/tes implémentation(s) de traitement dans le constructeur !
    Je parle éventuellement de création de procédure AddRow, RemoveRow, UpdateRow,...etc...... (des fonctions communes qui ensuite pourront être encapsulées dans une classe ....mais ça c'est à toi de voir pour le reste).

    En espérant avoir apporté quelques réponses constructives.

    PS : au passage en relisant ton code plus haut : je pense que dans ton projet tu devras souvent utiliser un objet avec les propriétés suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Description
    HostName
    PortFTP
    portTCP
    LogIn
    cryptage
    Idserveur
    Pourquoi ne pas créer une classe ou une structure avec 2 constructeurs : 1 sans paramètres et l'autre avec un type SQLiteDataReader ???

    Cdlt.

  7. #7
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut
    .unaise c'est mieux encore qu'une réponse constructive

    j'ai enfin pigé, ce n'est pas un passage de paramètre au constructeur la clé. On peut passer le paramètre au constructeur mais la clé c'est que la classe connaisse l'objet sur lequel agir et c'est là qu'on a la propriété

    j'ai fait ce petit projet avec 2 Forms, sans passer de paramètres au constructeur de Form2 mais en mettant en public la propriété de Form2 qui contient l'objet de Form1 sur lequel Form2 doit agir.
    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
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            Form2 maForm2 = new Form2();
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void btOuvrirForm2_Click(object sender, EventArgs e)
            {
                maForm2.m_monLabel = label1;
                maForm2.Show();
            }
     
            private void btLabel1actif_Click(object sender, EventArgs e)
            {
                maForm2.m_monLabel = label1;
            }
     
            private void btLabel2actif_Click(object sender, EventArgs e)
            {
                maForm2.m_monLabel = label2;
            }
        }
    }
    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
    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
     
            public Label m_monLabel { get; set; }
     
            public Form2()
            {
                InitializeComponent();
            }
     
       /*     public Form2(Label monLabel)
            {
                InitializeComponent();
                m_monLabel = monLabel;
            }
            */
     
            private void button1_Click(object sender, EventArgs e)
            {
                if (m_monLabel.Text == "toto")
                {
                    m_monLabel.Text = "lalalalalalalalalalalalala";
                }
                else
                {
                    m_monLabel.Text = "toto";
                }
     
            }
        }
    }
    C'est propre codé comme ça ?

    PS : et oui je vais faire une classe pour ma description, hostname et compagnie, je vais mettre des classes de partout !!!!!!!!!

    Bon une autre question subsidiaire pour la route
    Si je crée une classe qui décrit mon objet donnée qui aurait les propriétés description, hostname etc et que j'instancie un objet de cette classe dans Form1 pour l'utiliser de partout dans mon application, tel une variable globale; on est d'accord qu'il me faut alors passer à toutes les classes qui en auront besoin la référence à cet objet instancié dans Form1 ? en POO la notion même de variable globale n'existe pas, non ?

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  8. #8
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par petitours Voir le message
    .unaise c'est mieux encore qu'une réponse constructive

    j'ai enfin pigé, ce n'est pas un passage de paramètre au constructeur la clé. On peut passer le paramètre au constructeur mais la clé c'est que la classe connaisse l'objet sur lequel agir et c'est là qu'on a la propriété

    j'ai fait ce petit projet avec 2 Forms, sans passer de paramètres au constructeur de Form2 mais en mettant en public la propriété de Form2 qui contient l'objet de Form1 sur lequel Form2 doit agir.
    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
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            Form2 maForm2 = new Form2();
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void btOuvrirForm2_Click(object sender, EventArgs e)
            {
                maForm2.m_monLabel = label1;
                maForm2.Show();
            }
     
            private void btLabel1actif_Click(object sender, EventArgs e)
            {
                maForm2.m_monLabel = label1;
            }
     
            private void btLabel2actif_Click(object sender, EventArgs e)
            {
                maForm2.m_monLabel = label2;
            }
        }
    }
    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
    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
     
            public Label m_monLabel { get; set; }
     
            public Form2()
            {
                InitializeComponent();
            }
     
       /*     public Form2(Label monLabel)
            {
                InitializeComponent();
                m_monLabel = monLabel;
            }
            */
     
            private void button1_Click(object sender, EventArgs e)
            {
                if (m_monLabel.Text == "toto")
                {
                    m_monLabel.Text = "lalalalalalalalalalalalala";
                }
                else
                {
                    m_monLabel.Text = "toto";
                }
     
            }
        }
    }
    C'est propre codé comme ça ?
    Attention, dans le but d'obtenir un bon niveau de granularité dans ton projet il faut complètement éviter ce genre de pratique les variables dite globale sont à proscrire dans un usage à outrance !!!
    De plus dans les bonnes pratiques un constructeur comme son nom l'indique est un endroit ou on instancie les objets :

    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
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            'On déclare
            Form2 maForm2;
     
            public Form1()
            {
                InitializeComponent();
                'On instancie
                maForm2 = new Form2();
            }
     
            private void btOuvrirForm2_Click(object sender, EventArgs e)
            {
                maForm2.m_monLabel = label1;
                maForm2.Show();
            }
     
            private void btLabel1actif_Click(object sender, EventArgs e)
            {
                maForm2.m_monLabel = label1;
            }
     
            private void btLabel2actif_Click(object sender, EventArgs e)
            {
                maForm2.m_monLabel = label2;
            }
        }
    }

    Citation Envoyé par petitours Voir le message

    Bon une autre question subsidiaire pour la route
    Si je crée une classe qui décrit mon objet donnée qui aurait les propriétés description, hostname etc et que j'instancie un objet de cette classe dans Form1 pour l'utiliser de partout dans mon application, tel une variable globale; on est d'accord qu'il me faut alors passer à toutes les classes qui en auront besoin la référence à cet objet instancié dans Form1 ? en POO la notion même de variable globale n'existe pas, non ?

    Merci
    Ta classe pourrait se nommer Serveur.
    Oui pour ta 1ère question et oui et non pour la 2ème car on ne parle pas de variable globale mais d'une variable de telle ou telle portée (portée de classe, de méthode).

    Toi qui voulait éviter de te retrouver avec des pavés de code dans tes formulaire je te recommande vivement de passer tes paramètres dans les constructeur lorsque tu peux le faire. Toi qui a cette notion des variables globales tu dois aussi savoir qu'elles sont consommatrices en ressources...... tant qu'on le peut il faut les éviter d'autant plus qu'on privilégie l'utilisation de propriété plutôt que de simples variables.....

    Tu devrais lire ce document qui résume bien les bonnes pratiques.


    A+

  9. #9
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    La meilleure approche POO, comme dit par wallace1 ,c'est d'avoir :
    1/class Data:
    -class doté d'un event de Notification
    2/Gestion des data :un class Store qui fait interface avec ta bd...
    Le class Store doit disposer de
    prop
    -List<Data> c'est un BindingList<Data> dote de l'event ListChanged
    -chaine de connection
    -etc...
    méthodes Ad-Hoc :
    -chargemement des donnees
    -sauvegarde de donnes
    -maj des donnees
    -etc...
    L'interet des props et méthodes est que tous les forms sont assures d'avoir acces aux memes data..(synchronisation des donnees) car:
    2/Le class Store sera declare comme Public Static Prop ReadOnly dans le class Program,et donc accessible
    par tous les forms de la Class Application

    3/Gestion des forms auxiliaires :sera devolue au Form1
    -ils sont ajoutes via le method this.AddOwnedForm(leForm);
    -ils doivent etre supprimes via le method this.RemoveOwnedForm(leForm);
    -s'ils sont nombreux et toufus un list<Form> permettra de les parcourir) !!!
    -des boutons Show dans le Form Owner et un button Hide dans chaque "owned" sont suffissants pour un bon "switchbord"...

    4/les forms auxilaires ont acces au class Store via ses méthodes...
    5/le Binding regle la "musique" du "switchboard" ...

    5/un point nubeleux qui denote un DESIGN DANGEREUX :pourquoi fournir une ref sur control d'un FORMX à un autre FORMY...car un control est censé appartenir à son form proprietaire EXCLUSIVEMENT ....


    code exemple complet
    1/code behind .cs du class Data
    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
     
     
     
    public class Produit 
        {
            public event EventHandler PropertyChanged = null;
            private string _Description;
            public string Description
            {
                get { return _Description; }
                set { _Description = value; RaisePropertyChanged(); }
            }
            private string _HostName ;
            public string HostName 
            {
                get { return _HostName ; }
                set { _HostName  = value; RaisePropertyChanged(); }
            }
            private string _PortFTP;
            public string PortFTP
            {
                get { return _PortFTP; }
                set { _PortFTP = value; RaisePropertyChanged(); }
            }
     
     
            private void RaisePropertyChanged()
            {
                EventHandler h = PropertyChanged;
                if (h != null)
                {
     
                    h(this, new EventArgs());
                }
            }
        }
        public class Produits:BindingList<Produit>
        {
            public Produits()
            {}
        }
    2/ code behind .cs du class Store:
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
     
    namespace WinAppComponent
    {
        public class Produit 
        {
            public event EventHandler PropertyChanged = null;
            private string _Description;
            public string Description
            {
                get { return _Description; }
                set { _Description = value; RaisePropertyChanged(); }
            }
            private string _HostName ;
            public string HostName 
            {
                get { return _HostName ; }
                set { _HostName  = value; RaisePropertyChanged(); }
            }
            private string _PortFTP;
            public string PortFTP
            {
                get { return _PortFTP; }
                set { _PortFTP = value; RaisePropertyChanged(); }
            }
     
     
            private void RaisePropertyChanged()
            {
                EventHandler h = PropertyChanged;
                if (h != null)
                {
     
                    h(this, new EventArgs());
                }
            }
        }
        public class Produits:BindingList<Produit>
        {
            public Produits()
            {}
        }
     
     
    }
    3/code behind .cs du Form "owner" et des 2 Forms "owneds":
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
     
     //FORM OWNER
    public partial class Form1 : Form
        {
            private List<Form> ownedForms = new List<Form>();
     
            public Form1()
            {
                InitializeComponent();
     
                ownedForms.Add(new Form2());
                ownedForms.Add(new Form3());
                foreach (var item in ownedForms )
                {
                    this.AddOwnedForm(item);
                }
     
            }
            private void btnLoadProduits_Click(object sender, EventArgs e)
            {
     
                this.dataGridView1.DataSource = Program.StoreDB.Produits;
     
            }
     
            private void btnShowForm2_Click(object sender, EventArgs e)
            {
                ownedForms[0].Show();
     
            }
            private void btnShowForm3_Click(object sender, EventArgs e)
            {
                ownedForms[1].Show();
     
            }
     
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                foreach (var item in ownedForms)
                {
                    this.RemoveOwnedForm (item);
                }
            }
     
            private void btnAddProduit_Click(object sender, EventArgs e)
            {
                Produit prod = new Produit() { Description="newDesc", HostName ="new item",PortFTP="1500" };
                Program.StoreDB.AddProduit(prod);
            }
     
     
     
     
     
        }
     
     
    //FORM OWNED 1
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
     
            private void Form2_Load(object sender, EventArgs e)
            {
                this.dataGridView1.DataSource = Program.StoreDB.Produits; 
            }
     
            private void btnHide_Click(object sender, EventArgs e)
            {
                this.Hide();
            }
     
            private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                e.Cancel = true;
            }
     
        }
    //FORM OWNED 3
        public partial class Form3 : Form
        {
     
            public Form3()
            {
                InitializeComponent();
            }
            private void Form3_Load(object sender, EventArgs e)
            {
     
                this.listBox1.DataSource = Program.StoreDB.Produits;
                this.listBox1.DisplayMember = "HostName";
     
            }
     
     
            private void btnHide_Click(object sender, EventArgs e)
            {
                this.Hide();
            }
     
            private void btnDeleteProduit_Click(object sender, EventArgs e)
            {
                if (this.listBox1.SelectedIndex < 0) return;
                Produit prod = this.listBox1.SelectedItem as Produit;
                if (prod != null)
                {
                    Program.StoreDB.RemoveProduit(prod);
                }
            }
     
     
        }
    4/code behind .cs du class Program:

    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
     
     
     static class Program
        {
            private static Store _storeDB = new Store();
            public static Store StoreDB
            {
                get { return _storeDB; }
            }
     
     
            /// <summary>
            /// Point d'entrée principal de l'application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    bon code.........

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Mabrouki le "2/ code behind .cs du class Store:" ressemble étrangement au "1/code behind .cs du class Data" ?

    Au lieu de déclarer un get store dans la classe Program on peut aussi faire de Store un singleton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Store
    {
            private static Store _Instance = new Store();
            public static Store Instance
            {
                get { return _Instance; }
            }
     
            private Store()//constructeur privé
            {
     
             }
    }
    Peut-être "plus maintenable". Ça évite que d'autre dev qui passent par derrière n'utilisent pas la déclaration dans programme et fassent un new Sore là où ils ont besoin ?
    Enfin je pinaille

  11. #11
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut
    Bonjour

    j'ai bien compris la remarque de wallace1 sur mon code où j'ai confondu visibilité et instanciation...
    Le doc sur les bonne pratique est génial, j'avais noté et adopté quelques règles de syntaxe au fil de l'eau mais ça va bien plus loin, super. Merci

    Pour la réponse de MABROUKI je suis dessus mais ça introduit des nouvelles notions, je me fais mal aux cheveux à comprendre...ça va venir....

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  12. #12
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut
    Bonjour

    je découvre le AddOwnedForm(form).
    Cela permet uniquement d'avoir un formulaire qui réagit avec son parent (si je minimise Form1 sont OwnedForm Form2 sera réduit aussi.
    Ou cela permet au Ownedform Form2 d'avoir accès aux contrôles de Form1 ? (chose que je viens de teste mais qui ne semble pas être le cas)

    comme précisé plus haut le 2/ code behind .cs du class Store: semble ne pas avoir le bon code. Code qui m'intéresse pour comprendre ce formidable exemple de structure !

    Là j'en bave un peu pour comprendre, le dernier class "Program" je ne comprend absolument pas son rôle
    de même(mais c'est surement lié) que je ne comprends pas comment les codes au dessus peuvent utiliser la class Program avec program.StoreDB sans qu'il y ait eu quelquepart une instanciation de program avec un new Program

    Pour ceux qui se demandent : je suis d'une part autodidacte en programmation et surtout issu du C, qui n'est pas du tout POO comme ça.


    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  13. #13
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    StoreDB est déclarée comme statique; tu peux donc l'appeler sans instance class.variableStatique : http://dotnet.developpez.com/faq/csh...aniere-globale

  14. #14
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut
    énorme !

    Et je me rends compte que la FAQ que je n'arrivais pas à comprendre il y a pas si longtemps devient bien plus concrète et donc limpide avec ce que vous m'avez expliqué jusque là.
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  15. #15
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par petitours Voir le message
    énorme !

    Et je me rends compte que la FAQ que je n'arrivais pas à comprendre il y a pas si longtemps devient bien plus concrète et donc limpide avec ce que vous m'avez expliqué jusque là.
    Salut petitours,

    Pour te rassurer je suis également autodidacte depuis environ 8 ans et je suis passé par cette phase ou lorsqu'on parcours de nouveau certaines docs tout devient plus clair soudain.

    Bon courage pour la suite.

    PS : au passage merci à MABROUKI pour cet énorme complément d'infos ainsi qu'à lead8209

    Cdlt.

  16. #16
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    RE
    oups !!! je m'excuse mais le presse-papiers et ma souris m'ont joué un tour !!!

    voici le code behind.cs du class Store que j'ai loupé:

    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
     
     
     
     public   class Store
        {
            private string connectionStr = ""; 
            public Store()
            {
                Produits = GetProduits();
            }
            public Produits Produits { get; set; }
     
            private  Produits  GetProduits()
            {
                Produits produits = new Produits();
                Produit prod = null;
                //ce code doit etre reùplace 
                //ouverture de la cn
                //boucle du Reader , instanciation de prod et ajout à list 
     
                int port = 80;
                for (int i = 1; i < 11; i++)
                {
                    prod = new Produit() { Description="DesItem"+i.ToString(), HostName="item"+i.ToString(), PortFTP=port.ToString() };
                    port += 100;
                    produits.Add(prod);
                }
                return produits;
            }
            public void RemoveProduit(Produit item)
            {
                if (this.Produits != null && this.Produits.Count != 0)
                    this.Produits.Remove(item);
            }
            public void AddProduit(Produit item)
            {
                if (this.Produits != null)
                    this.Produits.Add(item);
            }
     
        }
    tu peux le transformer en single si tu veux !!!

    je découvre le AddOwnedForm(form).
    Cela permet uniquement d'avoir un formulaire qui réagit avec son parent (si je minimise Form1 sont OwnedForm Form2 sera réduit aussi.
    Non !!!
    J'ai déjà souligné que c'est un mauvais designe qu'un Form (et tout autre control par ailleurs) ai ses controls enfants exposes aux autres Forms ...
    Par contre le class Store est l "interface" entre la BD et les Forms ....
    Il est declare prop "static" dans Program pour s'assurer qu'une seule instance soit visible pour ltous les forms
    ce qui assure que tous les forms utilisent les memes données ....
    bon code...

  17. #17
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut
    Bonjour

    J'ai monté un projet avec l'exemple de MABROUKI, je l'ai mis en pièce jointe.

    Visual studio m'invite à virer les this. je l'ai donc fait

    Typiquement capable de m’embrouiller et de créer plusieurs instance de la classe Store dans quelques temps j'ai passé le classe en singleton (que j'ai évidement découvert au passage...)

    J'ai a peu prés tout pigé, c'est redoutable de simplicité par rapport à ce que j'aurais codé !
    J'ai passé tout au crible et il ne reste qu'un truc que j'ai pas pigé : la création d'un event dans la classe Produit. Je comprends bien l'idée que l'éventement est déclenché s'il y a modification d'une propriété. Il me semble aussi que dans ce code d'exemple on ne se sert null part de cet event (où alors j'ai vraiment rien compris du tout !) mais je ne comprends pas ce qu'on pourrait en faire de cet évent vu que avec le databinding de toute manière si on modifie les datas ça se met à jour de partout.

    Petite question subsidiaire pour aller plus loin :
    Si mes datas sont dans une base de données (SQLite dans mon cas mais peu importe) je suppose que je dois gérer la Base de données dans la classe Store mais faut il :
    -virer la BindingList et gérer à la place des datatable ?
    -garder la Bindinglist et gérer des mises à jour/enregistrement dans la Bdd à chaque modif ?
    -ou garder la BindingList et sauvegarder la List qu'à la fin à la sortie de l'appli (cette solution me paraitrait un peu dangereuse en cas de plantage du pc... )

    Merci

    PS : "les composants d'une form ne sont pas exposés à une autre form" c'est là ma nouvelle devise !
    Fichiers attachés Fichiers attachés
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  18. #18
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    re


    J'ai passé tout au crible et il ne reste qu'un truc que j'ai pas pigé : la création d'un event dans la classe Produit. Je comprends bien l'idée que l'éventement est déclenché s'il y a modification d'une propriété. Il me semble aussi que dans ce code d'exemple on ne se sert null part de cet event (où alors j'ai vraiment rien compris du tout !) mais je ne comprends pas ce qu'on pourrait en faire de cet évent vu que avec le databinding de toute manière si on modifie les datas ça se met à jour de partout.
    L"event est justement utilise par Maitre Biinding ( en interne pour le chgt de prop)...Sans lui Maitre Binding ne saurait "repercuter"(synchroniser) un chgt de prop dans les 3 forms de l'exemple !!!
    Absolument nécessaire au Binding et en accompagnement du vital BindingList...!!!


    Si mes datas sont dans une base de données (SQLite dans mon cas mais peu importe) je suppose que je dois gérer la Base de données dans la classe Store mais faut il :
    -virer la BindingList et gérer à la place des datatable ?
    Oui absolutly !!! un DataTable se comporte -EXACTEMENT-comme un BindingList ....!!!
    Donc le BindingList deviendra un DataTable
    Et exit du class Produit et son event ,car un DataRow le remplace avec les memes prop en bonus...

    dans le class Store comme ci-après:
    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
     
     
    public class StoreWithDataTable
        {
     
            private string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/OUNIS/Desktop/Projects/WinAppComponent/BDProduits.mdb"; 
            public StoreWithDataTable()
            {
                ProduitTable = GetProduitTable();
            }
            public DataTable ProduitTable { get; set; }
     
            private DataTable GetProduitTable()
            {
                //Produits produits = new Produits();
                //Produit prod = null;
                //ce code doit etre reùplace 
                //ouverture de la cn
                //boucle du Reader , instanciation de prod et ajout à list 
                DataTable dt = null;
                using (OleDbConnection connection =
                           new OleDbConnection(connectionString))
                {
     
                   OleDbDataAdapter  adapter = new OleDbDataAdapter ();
     
                    adapter.TableMappings.Add("Table", "Produit");
     
                    connection.Open();
     
                    OleDbCommand  command = new OleDbCommand (
                        "SELECT * FROM Produit;",
                        connection);
                    command.CommandType = CommandType.Text;
                    adapter.SelectCommand = command;
     
                    // Fill the DataSet.
                    DataSet dataSet = new DataSet("Produit"); 
                    adapter.Fill(dataSet);
     
                    dt = dataSet.Tables[0];
                    // Close the connection.
                    connection.Close();
                }
     
                return dt ;
            }
            public void RemoveProduit(DataRow  item)
            {
                if (this.ProduitTable != null && this.ProduitTable.Rows.Count != 0)
                    this.ProduitTable.Rows.Remove(item);
            }
            public void AddProduit(DataRow  item )
            {
                if (this.ProduitTable != null )
                    this.ProduitTable.Rows.Add (item);
            }
     
     
     
        }
    dans les 3 forms le code behind.cs sera :
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    public partial class Form1 : Form
        {
            private List<Form> ownedForms = new List<Form>();
            public Form1()
            {
                InitializeComponent();
                ownedForms.Add(new Form2());
                ownedForms.Add(new Form3());
                foreach (var item in ownedForms)
                {
                    this.AddOwnedForm(item);
                }
            }
     
            private void btnLoadProduits_Click(object sender, EventArgs e)
            {
                this.dataGridView1.DataSource = Program.StoreDB.ProduitTable;
     
            }
     
     
     
            private void btnShowForm2_Click(object sender, EventArgs e)
            {
                ownedForms[0].Show();
            }
     
            private void btnShowForm3_Click(object sender, EventArgs e)
            {
                ownedForms[1].Show();
            }
            private void btnAddProduit_Click(object sender, EventArgs e)
            {
                //Produit prod = new Produit() { Description = "newDesc", HostName = "new item", PortFTP = "1500" };
                DataRow dr = Program.StoreDB.ProduitTable.NewRow();
                dr["Description"] = "newDesc";
                dr["HostName"] = "new item";
                dr["PortFTP"] = "1500";
     
                Program.StoreDB.AddProduit(dr);
     
            }
     
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                foreach (var item in ownedForms)
                {
                    this.RemoveOwnedForm(item);
                }
            }
        }
     
     
    public partial class Form2 : Form
        {
            //FORM OWNED 1
            public Form2()
            {
                InitializeComponent();
            }
            private void Form2_Load(object sender, EventArgs e)
            {
                this.dataGridView1.DataSource = Program.StoreDB.ProduitTable;
     
            }
            private void btnHide_Click(object sender, EventArgs e)
            {
                this.Hide();
     
            }
     
            private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                e.Cancel = true;
            }
     
     
        }
     
     
    public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }
            private void Form3_Load(object sender, EventArgs e)
            {
                this.listBox1.DataSource = Program.StoreDB.ProduitTable;
                this.listBox1.DisplayMember = "HostName";
            }
            private void btnHide_Click(object sender, EventArgs e)
            {
                this.Hide();
            }
            private void btnDeleteProduit_Click(object sender, EventArgs e)
            {
                if (this.listBox1.SelectedIndex < 0) return;
                DataRowView drview = this.listBox1.SelectedItem as DataRowView;
                if (drview != null)
                {
                    Program.StoreDB.RemoveProduit(drview.Row);
                }
     
            }
     
            private void Form3_FormClosing(object sender, FormClosingEventArgs e)
            {
                e.Cancel = true;
            }
     
     
     
     
     
        }
    bon code...

  19. #19
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut
    Bonjour

    Pour l'histoire du event je ne comprends vraiment pas

    Avant de poser ma question hier j'ai mis en commentaire tout ce qui le concerne et le databinding fonctionne toujours
    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
        public class Produit
        {
       //     public event EventHandler PropertyChanged = null;
     
            private string _Description;
            public string Description
            {
                get { return _Description; }
                set { _Description = value; }// RaisePropertyChanged(); }
            }
     
            private string _HostName;
            public string HostName
            {
                get { return _HostName; }
                set { _HostName = value; }// RaisePropertyChanged(); }
            }
     
            private string _PortFTP;
            public string PortFTP
            {
                get { return _PortFTP; }
                set { _PortFTP = value; }// RaisePropertyChanged(); }
            }
     
     
            private void RaisePropertyChanged()
            {
                /*    EventHandler h = PropertyChanged;
                    if (h != null)
                    {
                        h(this, new EventArgs());
                    }*/
         //      PropertyChanged?.Invoke(this, new EventArgs());
            }
        }
    on dirait bien que le binding n'a pas besoin de cet evènement. Ça vient peut être du framework utilisé ??? là je suis en 4.5.2 sur mon projet de test.

    A noter que Visual studio (2015 community) m'invite à remplacer le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    EventHandler h = PropertyChanged;
    if (h != null)
    {
          h(this, new EventArgs());
    }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PropertyChanged?.Invoke(this, new EventArgs());
    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  20. #20
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 931
    Points : 1 977
    Points
    1 977
    Par défaut
    Bonjour

    L'utilisation de DataTable comme DataSource me pose un gros soucis

    Il est facile de charger le contenu d'une Base de donnée dans un Datatable que l'on met ensuite comme source de données d'un datagridwiew par exemple, par exemple avec
    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
    private DataTable GetTableServeurs()
            {
                using (SQLiteConnection maConnexion = new SQLiteConnection(StrConnexion))
                {
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter();
     
                    dataAdapter.TableMappings.Add("serveurs", "serveurs");                
     
                    SQLiteCommand comm = new SQLiteCommand("Select * From serveurs order by Description", maConnexion);
                    dataAdapter.SelectCommand = comm;
     
                    DataTable table = new DataTable();
                    table.Locale = System.Globalization.CultureInfo.InvariantCulture;
     
                    try
                    {
                        maConnexion.Open();         // Ouverture de la connexion
     
                        dataAdapter.Fill(table);    // Récupère les données
     
                        maConnexion.Close(); // Fermeture de la connexion à la base de données
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString(), "Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    }
     
                    return table;
                }
     
            }
    Il est ensuite super simple de modifier le Datatable soit par databinding, soit avec des datatable.rows.add ou remove (ou éditions)
    dans ma classe ce serait les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void RemoveServeur(DataRow item)
            {
                if (TableServeurs != null && TableServeurs.Rows.Count != 0)
                {
                    TableServeurs.Rows.Remove(item);
                    ServeursUpdateBdd(); //ce qui me pose soucis à la question ci dessous
                }
            }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void AddServeur(DataRow item)
            {
                if (TableServeurs != null)
                {
                    TableServeurs.Rows.Add(item);
                    ServeursUpdateBdd(); //ce qui me pose soucis à la question ci dessous
                }
            }
    Maintenant une fois le DataTable modifié (lignes en plus, en moins ou modifiées) on a évidement besoin de sauvegarder dans la base de données c'est pour ça que j'ai ajouté le ServeursUpdateBdd() et là patatra, je ne comprends plus rien, ça semble impossible à faire !
    J'ai essayé d'enregistrer ne Bdd avec la fonction ServeursUpdateBdd()
    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
    private void ServeursUpdateBdd()
            {
                using (SQLiteConnection maConnexion = new SQLiteConnection(StrConnexion))
                {
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter();
     
                    dataAdapter.TableMappings.Add("serveurs", "serveurs");
     
                    SQLiteCommand comm = new SQLiteCommand("Select * From serveurs order by Description", maConnexion);
                    dataAdapter.SelectCommand = comm;
     
                    DataTable table = new DataTable();
                    table.Locale = System.Globalization.CultureInfo.InvariantCulture;
     
                    try
                    {
                        maConnexion.Open();         // Ouverture de la connexion
     
                        dataAdapter.Fill(table);    // Récupère les données
     
                        table = TableServeurs;      // modification des données
     
                        dataAdapter.Update(table);  // enregistrement des modifications
     
                        maConnexion.Close(); // Fermeture de la connexion à la base de données
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString(), "Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    }
                }
            }
    mais ça lève une exception "Update requiert un InsertCommand valide lors du passage de la collection DataRow avec de nouvelles lignes"

    Si j'en crois ceci http://dotnet.developpez.com/articles/ado2/csharp/ il faut donner au Dataadapter une requête insert ou update pour modifier la base de donnée. Mais alors pourquoi modifier le dataTable si on ne peut pas faire un "DonnerALaBaseDeDonnéeLeEtatDuDatatable()" ? après avoir modifié simplement le datatable, il faut refaire le job en donnant une requête au DataAdapter !!??


    Quel est l’intérêt du Datatable dans ce cas, si ca complique la vie autant agir sur la base de donnée directement (sans Datatable) avec des choses telles que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQLiteConnection maConnexion = new SQLiteConnection(StrConnexion);
                    maConnexion.Open();
     
                    string sql = "UPDATE serveurs Set .......Where.....";
     
                    SQLiteCommand commande = new SQLiteCommand(sql, maConnexion);
                    commande.ExecuteNonQuery();
     
                    maConnexion.Close();
    bien plus simples... Mais j'ai surement rien pigé !!


    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/06/2014, 17h09
  2. Réponses: 3
    Dernier message: 15/04/2012, 10h17
  3. Réponses: 6
    Dernier message: 09/10/2010, 23h07
  4. [C#] Acceder à la méthode d'une autre form
    Par dacid dans le forum Windows Forms
    Réponses: 35
    Dernier message: 23/03/2005, 14h49
  5. Comment basculer le focus depuis une autre form ?
    Par altahir007 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 03/09/2003, 15h54

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