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 :

Dapper, SQLite, DatagridView et DataGridViewComboBoxColumn


Sujet :

C#

  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 591
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 591
    Par défaut Dapper, SQLite, DatagridView et DataGridViewComboBoxColumn
    Bonjour

    Décidément, je galère à chaque pas. Mais je ne vais pas me décourager.

    Ma DatagridView branchée sur ma table SQLite fonctionne bien.
    J'ai en fait 2 tables, une pour les documents et l'autre pour les groupes de documents.
    Les documents peuvent être des factures, des résultats médicaux, etc.
    Dans la DatagridView, j'ai mis une liste pour choisir le groupe auquel appartient le document.
    Pour obtenir les données de la liste, j'utilise un Datatable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    DataTable tableg = GetData("select id, group_name from groups", database.SqliteCnx());
                    ColComboBox.DataSource = tableg;
    Nom : grille.png
Affichages : 48
Taille : 5,5 Ko

    Suivant les conseils qu'on m'a donné ici, j'ai installé Dapper et j'ai codé l'équivalent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        internal class Groupe
        {
            public int id { get; set; }
            public required string group_name { get; set; }
            public string? description { get; set; }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        groups = database.SqliteCnx().Query<Groupe>("select id, group_name from groups");
        ColComboBox.DataSource = groups;
    Avec un point d'arrêt dans le code, je vérifié de contenu de groups et je vois bien mes différents groupes avec leurs id.

    Problème, à l'éxecution, je ramasse une erreur au moment où la grille tente de se remplir :

    ---------------------------
    Boîte de dialogue Erreur par défaut DataGridView
    ---------------------------
    L'exception suivante s'est produite dans le DataGridView*:

    System.FormatException: La valeur DataGridViewComboBoxCell n'est pas valide.

    Pour remplacer cette boîte de dialogue par défaut, traitez l'événement DataError.
    ---------------------------
    OK
    ---------------------------
    Quand je clique sur ok, je vois que la première ligne de la colonne Groupe affiche l'id du groupe au lieu d'afficher son nom.
    A chaque ligne, j'ai le même problème.

    Nom : grilleerreur.png
Affichages : 48
Taille : 26,6 Ko

    Donc je comprends l'exception FormatException puisqu'un nombre essaye de s'afficher au lieu d'un string.
    Mais je ne comprends pas pourquoi il veut afficher l'id au lieu du nom :-(

    Voilà le code concernant la colonne qui pose problème.

    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
     
                    DataGridViewComboBoxColumn ColComboBox = new DataGridViewComboBoxColumn();
                    ColComboBox.HeaderText = "Groupe";
                    ColComboBox.DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton;
                    ColComboBox.DisplayIndex = 2;
                    ColComboBox.Width = 150;
                    ColComboBox.ValueType = typeof (string);
     
                    // NE FONCTIONNE PAS
                    groups = database.SqliteCnx().Query<Groupe>("select id, group_name from groups");
                    ColComboBox.DataSource = groups;
     
                   // Fonctionne bien
                   // DataTable tableg = GetData("select id, group_name from groups", database.SqliteCnx());
                   // ColComboBox.DataSource = tableg;
     
                    ColComboBox.ValueMember = "id";
                    ColComboBox.DisplayMember = "group_name";
                    ColComboBox.DataPropertyName = "group_id";
                    dataGridView1.Columns.Add(ColComboBox);
    Une idée pour que je continue à avancer ?
    J-L aka Papy pour les amis

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 769
    Par défaut
    Il semble qu'une partie du problème vient du fait que Query renvoie un type IEnumerable et pas un type IList (en gros, un IEnumerable ne donne pas directement accès à tous les éléments, mais un élément après l'autre "à la demande", tandis que IList dispose de tous les éléments).
    Une correction simple à tester est de rajouter .ToList() à la ligne de Query
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    groups = database.SqliteCnx().Query<Groupe>("select id, group_name from groups").ToList();
    Il faut aussi que le ValueType corresponde au type du ValueMember et pas à celui du DisplayMember. Donc il doit être en int (ou long)

    Il pourrait aussi y avoir une erreur de type sur l'id; SQLite stockerait les entiers en 64bits ce qui correspond au long dans C#, donc si les corrections au dessus génèrent encore une erreur de type, c'est probalement ce point à corriger aussi.

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 591
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 591
    Par défaut
    D'abord merci pour la réponse.

    J'ai commencé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private IList<group> groups;
    et le ToList() mais ça n'a rien changé.

    Ensuite j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ColComboBox.ValueType = typeof(long);
    Idem

    J'ai aussi testé avec int32 vu que la requête principale utilise des int32 mais toujours pareil.

    Si je valide chaque exception sans passer la souris au-dessus de la grille j'arrive à cet affichage

    Nom : meme_erreur.png
Affichages : 20
Taille : 9,1 Ko

    Dès que je survole la grille avec la souris, l'erreur réapparait


    Pour terminer, j'ai chunté Dapper et fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    groups = new List<MaGED.group>
    {
        new group{ id = 3, group_name = "Santé"},
        new group{ id = 4, group_name = "Factures"},
        new group{ id = 5, group_name = "Hôpital"}
    };
    Le résultat est le même.
    J-L aka Papy pour les amis

  4. #4
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 591
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 591
    Par défaut
    aarghhhhhh

    C'est bon ! C'était un problème de type dans la définition de ma classe Group.
    J'ai mis l'id en long au lieu de int et ça marche.

    Un très grand merci pour m'avoir mis sur la piste.
    J-L aka Papy pour les amis

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

Discussions similaires

  1. datagridview SQLITE ajoute des column
    Par CLion dans le forum Langages
    Réponses: 0
    Dernier message: 18/09/2014, 15h41
  2. DataGridView et DataGridViewComboBoxColumn
    Par Wiwi31 dans le forum C#
    Réponses: 3
    Dernier message: 03/01/2014, 12h20
  3. Réponses: 2
    Dernier message: 14/11/2012, 09h05
  4. Réponses: 0
    Dernier message: 22/03/2011, 16h21
  5. DataGridView et DataGridViewComboBoxColumn !
    Par Kitano dans le forum Windows Forms
    Réponses: 11
    Dernier message: 27/04/2007, 18h41

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