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 :

DataGridView et entity framework problème de rafraichissement [Débutant]


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 21
    Points : 7
    Points
    7
    Par défaut DataGridView et entity framework problème de rafraichissement
    Bonjour à tous et a toutes,

    Tout d'abord je sais qu'il existe énormément de poste sur ce sujet de problème d'actualisation de datagridview mais aucun ne correspond à mon cas avec l'entity framework.

    Problème :
    Lors de l'insertion d'un ordinateur dans une base de données sql server, l'objet s'enregistre bien mais le datagridview ne s'actualise pas.
    Mon application dispose de 2 forms : 1 de base avec le datagridview et une autre avec le formulaire qui permet de rentrer les informations de l'ordinateur.

    Codes :

    Home.cs

    Cette fonction est celle qui gére le datagridview
    Je récupere la liste venant de la DB et je la rentre en tant que DataSource.
    A ce moment là ma datagridview se remplit bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void loadDgvComputer()
            {
                List<computer> liste = ComputerManager.Instance.getList();
                dgvHome.DataSource = liste.ToList();
                dgvHome.Columns[0].Visible = false; //Cache la colonne ID;
                dgvHome.Visible = true;
            }
    Mon instance pour faire appel a ma classe Home depuis d'autre classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //Singleton
            public static Home Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new Home();
                    }
                    return instance;
                }
    }

    FormComputer.cs

    J'enregistre correctement mon objet dans la DB et puis je fais appel a ce fameux bout de code dans Home.cs => Home.Instance.loadDgvComputer();
    En debug il passe bien dedans mais la datagridview n'est pas modifiée ...
    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
    private void cmdSaveComputer_Click(object sender, EventArgs e)
            {
                //1. On récupere tous les champs pour former l'objet
                    computer com = new computer();
                    com.brand = txtBrand.Text;
                    com.model = txtModel.Text;
                    com.type = txtType.Text;
                    com.warranty = txtWarranty.Text;
                    com.price = Double.Parse(txtPrice.Text);
                    //2. On injecte l'objet pour le persister
                    try
                    {
                        Boolean check = ComputerManager.Instance.save(com);
                        if (check == true)
                        {
                            MessageBox.Show("Computer enregistré correctement !");
                            Home.Instance.loadDgvComputer();
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("ERROR !!!" + ex.Message);
                    }
                }
            }
    J'avoue être perdu ... j'ai lu qu'il y aurait des problèmes avec le datasource qui convertirait après un databinding mais j'ai pas su aller vérifier dans le code source

    Auriez-vous des idées ?
    Merci d'avance.

  2. #2
    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
    Il me semble que l'instruction "liste.ToList()" fait un clone de la source. Dans ce cas, les modifications dans "liste" ne seraient pas répercutées dans le DataSource.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Bonjour et merci pour ta réponse.
    Même en supprimante le ToList(), j'ai le même problème.
    Ce qui est bizarre c'est qu'en mode debug ==> (voir fichier joint)


    Donc LOGIQUEMENT c'est bon alors pourquoi mon affichage reste le même ? J'avoue ne pas comprendre.
    Images attachées Images attachées  

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Peut-être qu'en utilisant la méthode Refresh du DataGridView, après avoir modifié ta liste, ça forcera la mise à jour (je ne reprend que la ligne 16 et 17 du code que tu as posté) :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MessageBox.Show("Computer enregistré correctement !");    // Ligne 16
    Home.Instance.loadDgvComputer();   // Ligne 17
    dgvHome.Refresh();    // A rajouter
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Hello,

    En mettant la datasource a Nothing avant de remettre la nouvelle liste est-ce que ça va mieux ?

    Sinon d'un façon plus générale (parce que Entity Framework et Winforms c'est tout un art de la bidouille...).

    1. Je te conseille de mettre une bindingsource sur ton formulaire et de lier ta grille à la bindingsource.

    2. Au chargement du formulaire, tu crées ta liste à partir de ta requête (tu peux même convertir cette list en une bindinglist ça ne mange pas de pain). Puis tu utilise cette bindinglist en tant que source de donnée pour ta bindingsource.

    3. Quand tu ajoutes (ou supprime) un objet. Tu réalises en premier lieu l'opération sur le Context puis sur la bindingsource (quoique de réaliser l'opération sur le bindingsource puis de capturer l'évenement qui sauvegardera la modification dans le context est peut être plus adapté).

    Pourquoi le bindingsource et bindinglist ?

    Les list implémente uniquement des évenements pour dire que les éléments qui les composent ont eu des modifications, mais pas pour annoncer qu'il y a eu un nouveau élément (ou une suppression d'élément). Ce qui pose problème au contrôle pour l'affichage. Les bindinglist gérent correctement ce point. Avec une list il faut réinitialiser complétement la liaison en cas d'ajout, ce qui provoque un clignement (vidage et remplissage de la grille) + perte de la position.

    La bindingsource permet d'accéder à des évenements qui permette de détecter si la grille a eu une modification (ajout, suppression, modification) ce qui permet de répercuter ces modifications au niveau d'entity Framework à la main.

    Les limitations : (eh oui il y en a...)

    Les bindinglist ne gérent pas les filtres et les tris tels que défini par les bindingsource. Et vu qu'on ne charge qu'une seul fois les données par Entity Framework on ne peut utiliser les requêtes pour s'en occuper (Sauf en vidant et en rechargant la bindingsource mais on retourne à la case de départ).

    Il est possible de faire sauter cette limitation en développant sa propre collection avec l'implémentation des interfaces nécessaire à ses fonctionnalités.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    DotNetMatt : Merci pour ta réponse mais sa n'a rien changé.

    sinople : Merci pour ta solution, elle a été la bonne . Juste en utilisant une bindingList au lieu d'une simple List ... c'est un peu capricieux mais sa passe. Merci. Je n'ai malheuresement pas su metttre en place un bindingSource sur le formulaire mais bon je pense que je peux m'en passer.

    Merci encore à tous pour vos réponse

    Voici le code source pour les futurs qui auraient le problème :

    Home.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void loadDgvComputer()
            {
                dgvHome.DataSource = ComputerManager.Instance.ListeComputer;
                dgvHome.Refresh();
                dgvHome.Update();
                dgvHome.Columns[0].Visible = false; //Cache la colonne ID;
                dgvHome.Visible = true;
            }
    ComputerManager.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //GET Liste
            public BindingList<computer> ListeComputer
            {
                get
                {
                    this.loadList();
                    return listeComputer;
                }
                set { listeComputer = value; }
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void loadList()
            {
                var computerList = from c in _dataContext.Db.computers
                                   select c;
                listeComputer.Clear();
                foreach (computer cp in computerList)
                {
                    listeComputer.Add(cp);
                }
            }
    /!\ Important la création de l'instance doit se faire en même temps que la création de l'attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private BindingList<computer> listeComputer = new BindingList<computer>();

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/02/2017, 10h35
  2. DataGridView et Entity Framework
    Par étudiant49 dans le forum Linq
    Réponses: 3
    Dernier message: 21/05/2011, 22h26
  3. [Entity Framework] Problème de visualisation du schema relationnel
    Par Leelith dans le forum Entity Framework
    Réponses: 1
    Dernier message: 15/04/2010, 22h55
  4. Réponses: 2
    Dernier message: 01/03/2010, 21h32
  5. [Entity Framework] Problème avec le Designer
    Par farfadet dans le forum Framework .NET
    Réponses: 16
    Dernier message: 18/02/2010, 13h13

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