[RISOLTO] Esportare/Importare Dati su File

di il
3 risposte

[RISOLTO] Esportare/Importare Dati su File

Buondì a tutti, rieccomi qua..
Ho fatto 5 o 6 passetti in avanti su certe cose e 2 o 3 indietro invece su altre
Ho un'applicazione ( ..o meglio dire vorrei tentare di fare più che ho..) con all'interno dei Button ed una dataGridView (con DataTable).
Sto tentando di trovare il modo di salvare su un file quello che io inserisco/modifico su una DataGridView (e fin qui ci riesco), il problema poi però ce l'ho quando tento di reimportarli .
Se sulla dataGridView avessi solo stringhe sarei già a posto, il problema è che, oltre ad avere delle stringhe di testo, ho anche delle date, orari, checkbox ed in futuro ( appena riesco a capire come inserirle a codice) anche delle combobox con valori prestabiliti.
Ho fatto delle prove scrivendo/leggendo su file di tipi binario (che sarebbe il formato di file che preferirei appunto usare) , altre prove con CSV ed XLS , ma niente da fare.
Il problema si presenta quando io modifico appunto i dati sulla DataGridView (associata ad una DataTable) e tento di reimportarli ( dopo averli ovviamente salvati).
Esempio :
  • Se io non inserisco degli orari, quando importo il file BIN mi inserisce di default l'orario 00:00 ;
  • Se io non inserisco una data, quando importo il file BIN mi inserisce di default 01/01/0001 ;
  • Se io non flaggo qualsiasi checkbox, quando importo il file BIN mi esce l'errore che quello che sto tentando di inserire non è un valore di tipo booleano (poi spiego il perché) ;
  • poi ho fatto le prove con XLS ed CSV ma gli errori sono grossomodo simili .
Penso che il tutto sia dovuto al fatto che salvo i dati come stringhe con il ToString e quindi poi da lì l'errore di incompatibilità boolean/string o il fatto che di default mi mette data ed orari in quel modo.

Allego il Codice, scusate se è un po' rozzo magari .. .

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 Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
using System.IO;
using System.Data.OleDb;
using DocumentFormat.OpenXml.Packaging;

namespace WindowsFormsApp1_C_Sharp
{
    public partial class Form1 : Form
    {
       
        public Form1()
        {
            InitializeComponent();
        }
    
        DataTable dtRegistro = new DataTable();   // DataTable del Registro entrate/uscite

        private void BtnEsci_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                // per catturare l'utente collegato per future implementazioni
                string NomeUtente = System.Environment.UserName;
                string DataOra = DateTime.Now.ToString("dd-MM-yyyy");
                MessageBox.Show(" "+ DataOra + " Ciao " + NomeUtente + ", Benvenuto !", "Prova",
                MessageBoxButtons.OK, MessageBoxIcon.Information);      
            
                 // Creazione delle colonne della DataTable dtRegistro       
                dtRegistro.Columns.Add("Data", typeof(DateTime));
                dtRegistro.Columns.Add("OraEntrata", typeof(DateTime));
                dtRegistro.Columns.Add("OraUscita",typeof(DateTime));
                dtRegistro.Columns.Add("Luogo", typeof(string));
                dtRegistro.Columns.Add("OK1", typeof(bool));
                dtRegistro.Columns.Add("OK2", typeof(bool));
                dtRegistro.Columns.Add("OK3", typeof(bool));                
                dtRegistro.Columns.Add("UscitaPrevista", typeof(DateTime));
                dtRegistro.Columns.Add("Descrizione", typeof(string));   
                

                // VALORI INSERITI PER FARE PROVE -- IN VERSIONE DEFINITIVA I VALORI VERRANNO INSERITI A MANO SULLA DATAGRIDVIEW

                //Definisco ed aggiungo una riga alla DataTable
                DataRow riga = dtRegistro.NewRow();
                
                riga["Data"] = "01/01/2022";
                riga["OraEntrata"] = "19:31";
                riga["OraUscita"] = "20:31";
                riga["Luogo"] = "Prova1";                              
                riga["OK1"] = true;
                riga["OK2"] = true;
                riga["OK3"] = true;          
                riga["UscitaPrevista"] = "01/01/2023";
                riga["Descrizione"] = "Descrizione1";
                ///Compilo le riga  
                dtRegistro.Rows.Add(riga);

                //Aggiungo una riga
                riga = dtRegistro.NewRow();

                riga["Data"] = "02/01/2022";
                riga["OraEntrata"] = "19:32";
                riga["OraUscita"] = "20:32";
                riga["Luogo"] = "Prova2";
                riga["OK1"] = true;
                riga["OK2"] = true;
                riga["OK3"] = true;
                riga["UscitaPrevista"] = "02/01/2023";
                riga["Descrizione"] = "Descrizione2";
                ///Compilo le riga 
                dtRegistro.Rows.Add(riga);

                //Aggiungo una riga
                riga = dtRegistro.NewRow();


                riga["Data"] = "03/01/2022";
                riga["OraEntrata"] = "19:33";
                riga["OraUscita"] = "19:33";
                riga["Luogo"] = "Prova3";
                riga["OK1"] = true;
                riga["OK2"] = true;
                riga["OK3"] = true;
                riga["UscitaPrevista"] = "03/01/2023";
                riga["Descrizione"] = "Descrizione3";
                ///Compilo le riga 
                dtRegistro.Rows.Add(riga);

                //Aggiungo una riga
                riga = dtRegistro.NewRow();

                riga["Data"] = "04/01/2022";
                riga["OraEntrata"] = "19:34";
                riga["OraUscita"] = "20:34";
                riga["Luogo"] = "Prova4";
                riga["OK1"] = true;
                riga["OK2"] = true;
                riga["OK3"] = true;
                riga["UscitaPrevista"] = "04/01/2023";
                riga["Descrizione"] = "Descrizione4";
                ///Compilo le riga 
                dtRegistro.Rows.Add(riga);

                //Indico che la dataGridView1 prende la DataTable dtRegistro come sorgente di dati
                dataGridView1.DataSource =dtRegistro;

                //Alcune impostazioni sulle colonne della dataGridView1
                dataGridView1.Columns["Data"].Width = 70;
                dataGridView1.Columns["Data"].DefaultCellStyle.Format = "d"; // Formattto come sola data
                dataGridView1.Columns["OraEntrata"].Width = 60;
                dataGridView1.Columns["Oraentrata"].DefaultCellStyle.Format = "t"; // Formattto come sola ora
                dataGridView1.Columns["OraUscita"].Width = 60;
                dataGridView1.Columns["OraUscita"].DefaultCellStyle.Format = "t"; // Formattto come sola ora
                dataGridView1.Columns["Luogo"].Width = 60;
                dataGridView1.Columns["OK1"].Width = 45;
                dataGridView1.Columns["OK2"].Width = 45;
                dataGridView1.Columns["OK3"].Width = 45;
                dataGridView1.Columns["UscitaPrevista"].Width = 70;
                dataGridView1.Columns["UscitaPrevista"].DefaultCellStyle.Format = "d";
                dataGridView1.Columns["Descrizione"].Width = 200;         
           
            }

            //Per la gestione degòli errori ed impedirne il blocco
            catch (Exception ex)
            {
                MessageBox.Show("Errore: " + ex.Message);
            }
        }

        //Prova di salvataggio del registro/entrate su File BIN
        private void BtnSalvaRegistro_Click(object sender, EventArgs e)
        {
            
            string file = @"C:\CartellaProva\RegistroEntrateUscite.bin";  
            using (BinaryWriter bw = new BinaryWriter(File.Open(file, FileMode.Create)))
            {
                bw.Write(dataGridView1.Columns.Count);
                bw.Write(dataGridView1.Rows.Count-1);  //Messo -1 altrimenti mi inserisce una riga vuota, cioè ne avevrei due vuote in fondo anzichè una
                foreach (DataGridViewRow dgvR in dataGridView1.Rows)
                {
                    for (int j = 0; j < dataGridView1.Columns.Count; ++j)
                    {
                        object val = dgvR.Cells[j].Value;
                        if (val == null)
                        {
                            bw.Write(false);
                            bw.Write(false);
                        }
                        else
                        {
                            bw.Write(true);
                            bw.Write(val.ToString());
                        }
                    }
                }
            }
    }

        private void BtnCaricaRegistro_Click(object sender, EventArgs e)
        {
            CaricaRegistro();
        }


        //Prova di recupero del registro/entrate da File BIN    -- Messo a parte (e non all'evento click) per integrazioni future
        private void CaricaRegistro()
        {
            ClearTable(dtRegistro);

            try
            {

                dtRegistro.Rows.Clear();
             

            string file = @"C:\CartellaProva\RegistroEntrateUscite.bin";
            using (BinaryReader bw = new BinaryReader(File.Open(file, FileMode.Open)))
            {
                int n = bw.ReadInt32();
                int m = bw.ReadInt32();
                for (int i = 0; i < m; ++i)
                {
                       dtRegistro.Rows.Add();                       

                        for (int j = 0; j < n; ++j)
                    {                           
                        if (bw.ReadBoolean())
                        {
                            dataGridView1.Rows[i].Cells[j].Value = bw.ReadString();
                        }
                        else bw.ReadBoolean();
                            
                        }
                }
            }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Errore: " + ex.Message);
            }
        }

    
        //Funzione per cancellare la tabella
            private void ClearTable(DataTable table)
        {
            // dataGridView1.Rows.Clear();
            try
            {
                table.Clear();
            }
            catch (DataException e)
            {
                // Process exception and return.
                Console.WriteLine("Exception of type {0} occurred.",
                    e.GetType());
            }

        }

 
             

      // Cancella le righe vuote lasciandone una in fondo
        private void CancellaRigheVuote()      
        {
            int j = 0;
            for (int i = 0; i < dataGridView1.RowCount - 1; i++)
            {
                if (dataGridView1.Rows[i].Cells[j].Value == null || dataGridView1.Rows[i].Cells[j].Value.ToString() == "")
                    {
                    dataGridView1.Rows.RemoveAt(i);
                   i--;
                }
            }
        }

        private void BtNCancellaRgheVuote_Click(object sender, EventArgs e)
        {
            CancellaRigheVuote();
        }
          
        private void BtnSvuotaRegistro_Click(object sender, EventArgs e)
        {
            ClearTable(dtRegistro);
        }

        //Prova di salvataggio del registro/entrate su File Excel CSV con Tabulazioni
        private void BtnEsporta_Click(object sender, EventArgs e)
        {
            TextWriter writer = new StreamWriter(@"C:\CartellaProva\RegistroEntrateUscite.csv");

            for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) // conto il numero di righe
            {

                for (int j = 0; j < dataGridView1.Columns.Count; j++) // conto il numero di colonne
                {
                    if (j == dataGridView1.Columns.Count - 1) // se sono all'ultima colonna
                    {
                        writer.Write("\t" + dataGridView1.Rows[i].Cells[j].Value.ToString());
                    }

                    else
                        writer.Write("\t" + dataGridView1.Rows[i].Cells[j].Value.ToString() + "\t" + "|");

                }

                writer.WriteLine("");

            }

            writer.Close();
            
        }


        //Prova di impotazione del registro/entrate da File Excel CSV con Tabulazioni
        private void BtnImporta_Click(object sender, EventArgs e)
        {
            ClearTable(dtRegistro);

            try
            {
                string[] lines = File.ReadAllLines(@"C:\CartellaProva\RegistroEntrateUscite.csv");
            string[] values;


            for (int i = 0; i < lines.Length; i++)
            {
                values = lines[i].ToString().Split('|');
                string[] row = new string[values.Length];

                for (int j = 0; j < values.Length; j++)
                {

                   row[j] = values[j].Trim();
                  
                    
                }
                dtRegistro.Rows.Add(row);
            }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Errore: " + ex.Message);
            }
        }
              

        //Prova di salvataggio del registro/entrate su File Excel XLS con Tabulazioni       
        private void BtnEsportaXLS_Click(object sender, EventArgs e)
        {
            TextWriter writer = new StreamWriter(@"C:\CartellaProva\RegistroEntrateUscite.xls");

            for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) // conto il numero di righe
            {

                for (int j = 0; j < dataGridView1.Columns.Count; j++) // conto il numero di colonne
                {
                    if (j == dataGridView1.Columns.Count - 1) // se sono all'ultima colonna
                    {
                      writer.Write("\t" + dataGridView1.Rows[i].Cells[j].Value.ToString());
                        
                    }

                    else
                    writer.Write("\t" + dataGridView1.Rows[i].Cells[j].Value.ToString() + "\t" + "|");
                   
                }

                writer.WriteLine("");

            }

            writer.Close();
        }

        //Prova di importazione del registro/entrate da File Excel XLS con Tabulazioni 
        private void BtnImportaXLS_Click_1(object sender, EventArgs e)
        {
            ClearTable(dtRegistro);

            try
            {

                string[] lines = File.ReadAllLines(@"C:\CartellaProva\RegistroEntrateUscite.xls");
            string[] values;


            for (int i = 0; i < lines.Length; i++)
            {
                values = lines[i].ToString().Split('|');
                string[] row = new string[values.Length];

                for (int j = 0; j < values.Length; j++)
                {

                    row[j] = values[j].Trim();


                }
                dtRegistro.Rows.Add(row);
            }
            
            }
            catch (Exception ex)
            {
                MessageBox.Show("Errore: " + ex.Message);
            }
}
                               
            }
}
Avete magari qualche suggerimento ?


Grazie .

3 Risposte

Devi accedere o registrarti per scrivere nel forum
3 risposte