Salve ho un problema con datagridview. Nel progetto che sto elaborando ho inserito la possibilità di importare file xls tramite la libreria Exceldatareader, ho applicato ad un pulsante il seguente codice per l'eportazione
using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel 97-2003|*.xls|Excel |*.xlsx", ValidateNames = true })
{
if (ofd.ShowDialog() == DialogResult.OK)
{
soll_slu_dgv.Columns.Clear();
soll_sle_dgv.Columns.Clear();
FileStream fs = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read);
IExcelDataReader reader;
if (ofd.FilterIndex == 1)
reader = ExcelReaderFactory.CreateBinaryReader(fs);
else
reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
result = reader.AsDataSet();
foreach (DataTable dt in result.Tables)
schede_xls_cb.Items.Add(dt.TableName);
reader.Close();
schede_xls_cb.SelectedIndex = 0;
soll_slu_dgv.Columns[0].HeaderText = "Tipo Comb";
soll_slu_dgv.Columns[1].HeaderText = "Comb";
soll_slu_dgv.Columns[2].HeaderText = "Fx [kN]";
soll_slu_dgv.Columns[3].HeaderText = "Fy [kN]";
soll_slu_dgv.Columns[4].HeaderText = "Fz [kN]";
soll_slu_dgv.Columns[5].HeaderText = "My[kN]";
soll_slu_dgv.Columns[6].HeaderText = "Mz[kNm]";
soll_slu_dgv.Columns[0].DefaultCellStyle.Format = "0";
FileStream fs2 = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read);
IExcelDataReader reader2;
if (ofd.FilterIndex == 1)
reader2 = ExcelReaderFactory.CreateBinaryReader(fs2);
else
reader2 = ExcelReaderFactory.CreateOpenXmlReader(fs2);
result2 = reader2.AsDataSet();
foreach (DataTable dt2 in result2.Tables)
schede_xls2_cb.Items.Add(dt2.TableName);
reader2.Close();
schede_xls2_cb.SelectedIndex = 1;
soll_sle_dgv.Columns[0].HeaderText = "Tipo Comb";
soll_sle_dgv.Columns[1].HeaderText = "Comb";
soll_sle_dgv.Columns[2].HeaderText = "Fx [kN]";
soll_sle_dgv.Columns[3].HeaderText = "Fy [kN]";
soll_sle_dgv.Columns[4].HeaderText = "Fz [kN]";
soll_sle_dgv.Columns[5].HeaderText = "My[kN]";
soll_sle_dgv.Columns[6].HeaderText = "Mz[kNm]";
soll_sle_dgv.Columns[0].DefaultCellStyle.Format = "0";
try
{
}
catch (Exception)
{
MessageBox.Show("Prima di caricare un nuovo file excel, nel caso sia presente una tabella di verifica non vuota è " +
"necessario cancellare la tabella nella scheda 'Verifica SETTO a Pressoflessione e taglio' con l'apposito pulsante.\n\n" +
"Sarà poi necessario aggiornare il file dalla scheda 'Sollecitazioni SETTO'", "ERRORE", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
ho inserito poi la possibilità di importazione nella stessa datagridview di un file da me creato con altro mio programma (un file xml strutturato ad hoc per andare a riempire la datagridview che permette l'importazione del file xlsx).
DataSet ds1 = new DataSet();
//ds.ReadXml(@"D:\data.xml");
ds1.ReadXml(openFileDialog2.FileName);
soll_slu_dgv.Columns.Clear();
soll_sle_dgv.Columns.Clear();
result.Tables.Clear();
result2.Tables.Clear();
//sollecitazini slu
if (ds1.Tables["dgv_slu"] != null)
{
soll_slu_dgv.Columns.Add("tipo_slu_xls", "Tipo");
soll_slu_dgv.Columns.Add("comb_slu_xls", "Comb.");
soll_slu_dgv.Columns.Add("fx_slu_xls", "Fx");
soll_slu_dgv.Columns.Add("fy_slu_xls", "Fy");
soll_slu_dgv.Columns.Add("fz_slu_xls", "Fz");
soll_slu_dgv.Columns.Add("my_slu_xls", "My");
soll_slu_dgv.Columns.Add("mz_slu_xls", "Mz");
foreach (DataRow posiz in ds1.Tables["dgv_slu"].Rows)
{
int n = soll_slu_dgv.Rows.Add();
soll_slu_dgv.Rows[n].Cells[0].Value = posiz[0].ToString();
soll_slu_dgv.Rows[n].Cells[1].Value = posiz[1].ToString();
soll_slu_dgv.Rows[n].Cells[2].Value = posiz[2].ToString();
soll_slu_dgv.Rows[n].Cells[3].Value = posiz[3].ToString();
soll_slu_dgv.Rows[n].Cells[4].Value = posiz[4].ToString();
soll_slu_dgv.Rows[n].Cells[5].Value = posiz[5].ToString();
soll_slu_dgv.Rows[n].Cells[6].Value = posiz[6].ToString();
}
}
//sollecitazini slv
if (ds1.Tables["dgv_slv"] != null)
{
foreach (DataRow posiz in ds1.Tables["dgv_slv"].Rows)
{
int n = soll_slu_dgv.Rows.Add();
soll_slu_dgv.Rows[n].Cells[0].Value = posiz[0].ToString();
soll_slu_dgv.Rows[n].Cells[1].Value = posiz[1].ToString();
soll_slu_dgv.Rows[n].Cells[2].Value = posiz[2].ToString();
soll_slu_dgv.Rows[n].Cells[3].Value = posiz[3].ToString();
soll_slu_dgv.Rows[n].Cells[4].Value = posiz[4].ToString();
soll_slu_dgv.Rows[n].Cells[5].Value = posiz[5].ToString();
soll_slu_dgv.Rows[n].Cells[6].Value = posiz[6].ToString();
}
}
//sollecitazini sld
if (ds1.Tables["dgv_sld"] != null)
{
foreach (DataRow posiz in ds1.Tables["dgv_sld"].Rows)
{
int n = soll_slu_dgv.Rows.Add();
soll_slu_dgv.Rows[n].Cells[0].Value = posiz[0].ToString();
soll_slu_dgv.Rows[n].Cells[1].Value = posiz[1].ToString();
soll_slu_dgv.Rows[n].Cells[2].Value = posiz[2].ToString();
soll_slu_dgv.Rows[n].Cells[3].Value = posiz[3].ToString();
soll_slu_dgv.Rows[n].Cells[4].Value = posiz[4].ToString();
soll_slu_dgv.Rows[n].Cells[5].Value = posiz[5].ToString();
soll_slu_dgv.Rows[n].Cells[6].Value = posiz[6].ToString();
}
}
//sollecitazini sle
if (ds1.Tables["dgv_sle"] != null)
{
soll_sle_dgv.Columns.Clear();
soll_sle_dgv.Columns.Add("tipo_sle_xls", "Tipo");
soll_sle_dgv.Columns.Add("comb_sle_xls", "Comb.");
soll_sle_dgv.Columns.Add("fx_sle_xls", "Fx");
soll_sle_dgv.Columns.Add("fy_sle_xls", "Fy");
soll_sle_dgv.Columns.Add("fz_sle_xls", "Fz");
soll_sle_dgv.Columns.Add("my_sle_xls", "My");
soll_sle_dgv.Columns.Add("mz_sle_xls", "Mz");
foreach (DataRow posiz in ds1.Tables["dgv_sle"].Rows)
{
int n = soll_sle_dgv.Rows.Add();
soll_sle_dgv.Rows[n].Cells[0].Value = posiz[0].ToString();
soll_sle_dgv.Rows[n].Cells[1].Value = posiz[1].ToString();
soll_sle_dgv.Rows[n].Cells[2].Value = posiz[2].ToString();
soll_sle_dgv.Rows[n].Cells[3].Value = posiz[3].ToString();
soll_sle_dgv.Rows[n].Cells[4].Value = posiz[4].ToString();
soll_sle_dgv.Rows[n].Cells[5].Value = posiz[5].ToString();
soll_sle_dgv.Rows[n].Cells[6].Value = posiz[6].ToString();
}
}
funziona tutto se carico o solo file xls o solo file personali (xlm), però se vado a caricare prima un file xls e successivamente un file personale (xml) dopo aver preventivamente cancellato tutte le righe e tutte le colonne della datagridview, il programma si blocca e viene segnalato il seguente errore.
"Impossibile aggiungere righe a livello di codice alla raccolta di righe di DataGridView in caso di associazione a dati del controllo."
Come posso risolvere il problema?
grazie anticipate a tutti