Alimentation d'une DATAGRIDVIEWCOMBOBOX par une donnée SQLITE

Signaler
-
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
-
Bonjour,

Je cherche à faire une petite appli pour gérer ma compta perso.
Mes données se trouvent dans une table SQLITE.

A l’ouverture de mon appli, je veux lire les données dans cette table et les afficher dans un DATAGRIDVIEW.

J’ai un pb que je n’arrive pas à résoudre :
Voilà la disposition que je souhaite dans mon DATAGRIDVIEW :

DATE | LIBELLE | MONTANT | CATEGORIE | SOUS-CATEGORIE | COMPLEMENT | SOLDE

Les colonnes CATEGORIE et SOUS-CATEGORIE sont des COMBOBOX. Le reste est du TEXTBOX.
Je n’arrive pas à alimenter les COMBOBOX avec les données lues dans SQLITE .

Mon code :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;
using System.IO;
using System.Globalization;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        // chemin de la base de données
        string dbPath = "C:\\Users\\janfi\\Google Drive\\PROGRAMMATION\\COMPTA\\WindowsFormsApp1\\compta.db";

        public Form1()
        {
            InitializeComponent();
        }

        //Au chargement du programme
        private void Form1_Load(object sender, EventArgs e)
        {
            // on ouvre la table SQLITE pour afficher les enregistrements dans une grille
            SQLiteConnection connection = new SQLiteConnection("DataSource=" + dbPath);
            connection.Open();
            SQLiteCommand command = new SQLiteCommand(connection)
            {
                CommandText = "SELECT DATE, LIBELLE, MONTANT, CATEGORIE, SOUS_CATEGORIE, COMPLEMENT, SOLDE from compte ORDER BY ID DESC"
            };
            
            using (SQLiteDataReader sdr = command.ExecuteReader())
            {

                //create a new Database
                DataTable table = new DataTable();
                
                //LOAD DATAREADER INTO THE DATATABLE
                table.Load(sdr);
                sdr.Close();
                connection.Close();
                //on affiche les données lues dans la grille d'affichage
                dataGridView1.DataSource = table;
                
            }
        }
    }

    public class ComptaCSV
    {
        public string Date { get; set; }
        public string Libelle { get; set; }
        public double Montant_euros { get; set; }
        public double Montant_francs { get; set; }
    }
}


Je n’affiche pas mon code car je n’arrive déjà pas à me décider sur la manière de faire pour le DATAGRIDVIEW : est-ce que je construis les colonnes directement dans le DATAGRIDVIEW ? Est-ce que je les construis dans mon programme ?
C’est une question plutôt générale pour commencer mais comment feriez-vous ?

Merci pour votre aide

4 réponses

Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
554
Bonjour
Voici un court tuto pour bien utiliser les balises de codes et donc vien presenter ton code https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Pour le xaml, il faut choisir xml.

Tu as encore le temps d’éditer ton message.

Un autre point et pas des moindres, un datagridview et un datagrid sont deux contrôles très différents.
Le datagridview n’existe pas en xaml, c’est un contrôle winform et inversement.

Quand tu auras modifié, ta présentation, je pourrais mieux lire et avancer sur ton problème.

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Salut,

voilà c'est modifié. Je n'avais pas copié le bon code.

Merci
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
554
C'est dommage, il y a longtemps que j'ai arrêté de bidouiller des contrôles winform, au profit du xaml bien plus souple et puissant.
Je vais tâcher de me pencher sur ton code, mais avec moins d'optimisme qu'il y a 20 minutes.
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
554
Voilà ce que je te propose, tu écris une classe qui correspond à tous les champs de la table.
Un peu comme ComptaCsv, mais complet et la date de type DateTime
(travailler avec des dates en string est une erreur fondamentale, par exemple en string "01/12/2020" est avant "02/01/2020", ou encore "30/02/2020" existe) .

Ensuite, à partir de la datatable, tu charges une List<T>, un truc dans le genre
List<Compta> comptas = table.AsEnumerable().Select(m => new Compta()
{
   Date = m.Field<DateTime>("DATE"),
   Libelle = m.Field<string>("LIBELLE"),
   Montant = m.Field<double>("MONTANT"),
//ect pour tous les champs
}).ToList()

(source https://stackoverflow.com/questions/1427484/convert-datatable-to-listt )

C'est cette liste qui sera le DataSource du datagriview, à la place de la table.

Ensuite, pour chaque combobox, une requête Select.Distinct
List<string> categories = comptas.Select(c => c.Categorie).Distinct();
List<string> sousCategories = comptas.Select(c => c.SousCategorie).Distinct();


Ensuite à priori tu devrais pouvoir affecter ces 2 listes comme source des combobox.

Je dis à priori, car je n'ai pas essayé, j'ai tapé ces lignes directement dans le message.


PS pour Sqlite, je me sers d'une classe qui permet de charger directement dans des List<T> et de faire des requêtes Linq sans Datatable: sqlite-net https://www.nuget.org/packages/sqlite-net/ . Tu peux la télécharger avec le gestionnaire NuGet de Visual Studio
PS2 le solde étant le résultat d'une opération, il n'est pas forcément nécessaire que ce soit un champ dans la base de donnée.