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 .