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 - c# Exception Non gérée


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    DataGridView - c# Exception Non gérée
    Bonjour la communauté. s'il vous plait j'ai un souci. je suis entrain de réaliser un projet dans le but de m'exercer un peu. je veut réaliser un programme c# windows form pour la gestion de bibliothèque et pour cela j'utilise un datagridview pour la collecte des fichiers et un fichier excel pour l'enregistrement de ces données. au chargement de la fenêtre les données devrons être charger dans le datagrid l'utilisateur devrais pouvoir ensuite ajouter des lignes dans le datagrid sauf que le message d'exception qui est affiché es: "impossible d'ajouter par programmation des lignes à la collection de lignes datagridview lorsque le contrôle est lié aux données". du coup impossible pour l'utilisateur d'ajouter une nouvelle. le code pour la connexion au fichier excel pour l'insertion des données dans le datagrid
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    System.Data.OleDb.OleDbConnection MyConnection;
                System.Data.DataSet DtSet;
                System.Data.OleDb.OleDbDataAdapter MyCommand;
                MyConnection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Users\NGOUNOU\Desktop\Livre.xlsx';Extended Properties=Excel 12.0;");
                MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Feuil1$]", MyConnection);
                MyCommand.TableMappings.Add("Table", "Net-informations.com");
                DtSet = new System.Data.DataSet();
                MyCommand.Fill(DtSet);
                dataGridView1.DataSource = DtSet.Tables[0];
                MyConnection.Close();

    Code pour le bouton ajouter pour une nouvelle ligne
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    dataGridView1.Rows.Add(IntLivre.Text, MaisonEdition.Text, AuteurLivre.Text, type, LbDate.Text);

    Le deuxième problème réside dans l'enregistrement dans le fichier excel. quand j'appuis sur le bouton enregistré une exception est généré

    l'image de l'execption

    et le sode du bouton enregistré
    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
    private void Btn_Enregistre_Click(object sender, EventArgs e)
            {
                if (MessageBox.Show("voulez vous enregistrer les données?", "confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    try
                    {
                        string chemin = "";
                        saveFileDialog1.Filter = "Document Excel|.*xlsx";
                        if (saveFileDialog1.ShowDialog() == DialogResult.OK) chemin = saveFileDialog1.FileName;
                        StreamWriter writer = new StreamWriter(chemin);
                        Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
                        Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
                        Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
                        worksheet = workbook.Sheets[1];
                        worksheet = workbook.ActiveSheet;
                        worksheet.Name = "CustommerDetail";
                        for (int i = 1; i < dataGridView1.Columns.Count + 1; i++)
                        {
                            worksheet.Cells[i, 1] = dataGridView1.Columns[i - 1];
                        }
                        for (int i = 0; i < dataGridView1.Rows.Count; i++)
                        {
                            for (int j = 0; j < dataGridView1.Columns.Count; j++)
                            {
                                worksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
                            }
                        }
                        var sauvegarder = new SaveFileDialog();
                        sauvegarder.FileName = "Livre";
                        sauvegarder.DefaultExt = "xlsx";
                        if (sauvegarder.ShowDialog() == DialogResult.OK)
                        {
                            workbook.SaveAs(sauvegarder.FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                        }
                        app.Quit();
                    }
                    catch (Exception E)
                    {
                        MessageBox.Show("erreur d'enregistrement"+E.Message);
                    }
                }
            }

    j'aimerai savoir qu'elles sont mes erreurs et si possible des solutions et d'autre méthode pour l'importation et l'exportation des données via excel et s'il y une autre méthode plus efficace de gérer ses données que de passer par le fichier excel.

    Merci à vous

  2. #2
    Membre émérite
    Pour la grille, c'est tout à fait normal.
    Ce n'est pas la grille qu'il faut mettre à jour mais le DataSet qui la remplit

    Pour Excel, j'utilise généralement OpenXML car je peut interagir avec un XLSX sans avoir Excel d'installé.
    Mais du peu d’interopérabilité que j'ai fait je n'utilise pas les _XXXX
    Exemple au lieu de Microsoft.Office.Interop.Excel._Application, j'utilise Microsoft.Office.Interop.Excel.Application
    J'avais également l'habitude de déclarer mon using de la manière suivante
    using Excel = Microsoft.Office.Interop.Excel;


    De cette manière je pouvais raccourcir mes lignes de cette manière
    Excel.Application excelApp = new Excel.Application();


    Mais ce qui me choque le plus, c'est que tu crée une source de données avec le fichier Excel pour ton DataSet mais qu'au lieu de te servir de cette source de données pour mettre à jour ton fichier, tu passes par interopérabilité.
    Tu risques des accès concurrents à un moment où un autres.

    Après il existe beaucoup de SGBDR gratuits qui seraient beaucoup plus efficace qu'un fichier Excel.

  3. #3
    Expert confirmé
    bonjour

    Utiliser Excel ,un tableur ,comme bd est un abus ("a3beth") le tableur n'etant pas prevu pour cet usage ,comme dit par popo.

    Maintenant si tu t'obstines sur cette voie ,tu dois savoir que tu peux ajouter ou modifier des lignes (row) mais il est impossible de supprimer des lignes ,alas.

    Pour ce faire munis-toi d'un DataSet et ingrédient essentiel d'un BidindingSource charge de fournir un "pointeur" sur la ligne en cours (à ajouter ou à modifier).
    Ce BDS restitue un DataRowView qui contient le DataRow en cours.
    code behind.cs complet:
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.OleDb;
    using System.Globalization;
    namespace WinExcelDGV
    {
        public partial class frmTest : Form
        {
     
            private string strCon = null;
            private OleDbConnection MyConnection = null;
            private OleDbDataAdapter da = null;
            private DataSet ds = null;
                public frmTest()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
                strCon = GetStrCon();
                MyConnection = new OleDbConnection(strCon);
                MyConnection.Open();
                string strSelect ="SELECT * FROM [Feuil1$]";
                da = new OleDbDataAdapter(strSelect, MyConnection);
     
                ds = new DataSet();
                da.Fill(ds);
                string sourceTable = "Table";
                da.TableMappings.Add(sourceTable, "Net-informations.com");
                bindingSource1.DataSource = ds;
                bindingSource1.DataMember = ds.Tables[0].TableName;
     
                this.MyDGV.DataSource = bindingSource1;
                MyConnection.Close();
            }
            private void btnSaveAll_Click(object sender, EventArgs e)
            {
                if (bindingSource1 == null) return;
     
                DataRowView drv = bindingSource1.Current as DataRowView;
                DataRow dr = drv.Row;
                if (dr.RowState == DataRowState.Added) // nouvelle ligne ajouté 
                   AddRow(dr);
                else if (dr.RowState == DataRowState.Modified)// ligne existante modifié 
                   UpdateRow(dr) ;
                dr.AcceptChanges();
            }
            private void AddRow(DataRow dr)
            {
                int numero = Convert.ToInt32(dr["IntNUMERO"]);
                string nom = dr["NOM"].ToString();
                string salaire = dr["SALAIRE"].ToString();
     
                strCon = GetStrCon();
                string strInsert =
                           "INSERT INTO  [Feuil1$] (IntNUMERO,NOM,SALAIRE) " +
                "VALUES('"+ numero +"','" + nom + "', '" + salaire + "')";
                MessageBox.Show(strInsert);
     
                MyConnection = new OleDbConnection(strCon);
                MyConnection.Open();
                OleDbCommand cmdInsert = new OleDbCommand(strInsert, MyConnection);
                int nbRecords =  cmdInsert.ExecuteNonQuery();
                MessageBox.Show("Records inserted :" + nbRecords.ToString()); 
     
     
                MyConnection.Close();
            }
            private void UpdateRow(DataRow dr)
            {
                try
                {
                    int numero = Convert.ToInt32(dr["IntNUMERO"]);
                    string nom = dr["NOM"].ToString();
                    string salaire = dr["SALAIRE"].ToString();
     
                    string strUpdate =
                        "UPDATE [Feuil1$] SET  NOM = '" + nom + "',  SALAIRE ='" + salaire + "'  WHERE  (IntNUMERO = " + numero + ");";
                    MessageBox.Show(strUpdate);
     
                    MyConnection = new OleDbConnection(strCon); 
                    MyConnection.Open();
                    OleDbCommand cmdUpdate = new OleDbCommand(strUpdate, MyConnection);
                    int nbRecords = cmdUpdate.ExecuteNonQuery();
                    MessageBox.Show("Records updated :"+ nbRecords.ToString() );
                    MyConnection.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
            private string GetStrCon()
            {
     
                return @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Users\victor perez\Desktop\BdExcel\Test.xlsx';Extended Properties='Excel 12.0 Xml;HDR=YES'";
     
            }
     
     
     
     
        }
    }

    bon code...