Salve ho un problema con le istruzioni da me inserite in un programma per poter aprire un file salvato. Scusate se magari sarò un poco lungo ma cercherò di far capire quale è il problema.
Ho un programma con diverse Form che si aprono all'interno di una principale (IsMidiContainer = true).
Nella form principale è stato creato un
public Dataset ds = new DataSet();
In modo che possa essere visto anche dalle altre form.
All'interno delle varie finestre ho aperto una serie di public void apri e public void salva, dove vado a inserire i dati che voglio salvare, creando una seria di DataTable con all'interno Row dove inserisco i dati da salvare.
Quindi nella form principale (IsMidiContainer) inserisco il richiamo alle varie form cancellando prima dal dataset le tables create ad esempio
private void salva()
{
ds.Tables.Clear();
..........
az.salva_azioni();
}
richiamato dal pulsante salva con nome
private void ds_saveAs()
{
salva();
ds.WriteXml(saveFileDialog1.FileName); //comando per salva con nome
// ds.WriteXml(@"D:\data.xml"); //comando per salva con nome scelto a priori
}
Mentre nella form secondaria "Azioni" inserisco ciò che deve essere copiato all'interno di ds aperto prima
public void salva_azioni()
{
//unità di misura
DataTable dt_um = new DataTable();
dt_um.TableName = "dt_um";
int nc = 3 + 1;
for (int i = 0; i < nc; i++)
{
dt_um.Columns.Add();
}
((Form1)f1).ds.Tables.Add(dt_um);
DataRow r_um = f1.ds.Tables["dt_um"].NewRow();
r_um[0] = kg_cm_um_nodi_rb.Checked;
r_um[1] = daN_cm_um_nodi_rb.Checked;
r_um[2] = daN_m_um_nodi_rb.Checked;
r_um[3] = kN_m_um_nodi_rb.Checked;
f1.ds.Tables["dt_um"].Rows.Add(r_um);
..............
continua con molti altri dati
sono presenti anche dei datagridview
}
Una volta salvato tutto si arriva al problema dell'apertura (essenzialmente con i dati contenuti nelle datagridview)
Passiamo quindi all'apertura, anche in questo caso è stato creato un riferimento ad public void apri_azioni (esempio) ad i vari form presenti, per inserire i dati aperti nelle varie textbox e datagridview.
Dato che avevo problemi per l'inserimento dei dati nei datagridview andandoli ad mettere nel public void apri_azioni (nella form secondaria) in quanto venivano caricati più volte (non so perchè), ho pensato di inserire nella form principale oltre al richiamo ad i vari "apri" presenti nelle varie form anche il diretto collegamento ai vari datagridview. Ma andiamo per ordine
Ho associato al pulsante apri della form principale l'apertura di un void ds_apri (sempre nella form principale), quindi ho inserito al pulsante apri il seguente codice
private void apri_ttbtn_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
conta_apri = 1;
conta_apri_punz = 1;
ds_apri();
string s = openFileDialog1.FileName;
string[] nome = s.Split('\\');
this.Text = "NOME FORM.text - [ " + nome[nome.Length - 1] + " ]";
sez_tsbtn_Click(sender, e);
ver_punz_tsbtn.Enabled = true;
}
}
di seguito il codice inserito in ds_apri
private void ds_apri()
{
ds.Clear();
ds.ReadXml(openFileDialog1.FileName);
................
altri richiami a form
.............
az.apri_azioni();
//APERTURA DATAGRIDVIEW VARI
//FORM AZIONI - IMP AZIONI
if (ds.Tables["dgv_imp_az"] != null)
{
az.azioni_imp_dgv.Rows.Clear();
foreach (DataRow posiz in ds.Tables["dgv_imp_az"].Rows)
{
int n = az.azioni_imp_dgv.Rows.Add();
az.azioni_imp_dgv.Rows[n].Cells[0].Value = posiz[0].ToString();
az.azioni_imp_dgv.Rows[n].Cells[1].Value = posiz[1].ToString();
az.azioni_imp_dgv.Rows[n].Cells[2].Value = posiz[2].ToString();
az.azioni_imp_dgv.Rows[n].Cells[3].Value = posiz[3].ToString();
az.azioni_imp_dgv.Rows[n].Cells[4].Value = posiz[4].ToString();
az.azioni_imp_dgv.Rows[n].Cells[5].Value = posiz[5].ToString();
az.azioni_imp_dgv.Rows[n].Cells[6].Value = posiz[6].ToString();
}
}
...........
più altri richiami a form
}
nella form azioni presente nel richiamo in ds_apri è stato inserito il seguente codice
public void apri_azioni()
{
((Form1)f1).ds.ReadXml(((Form1)f1).openFileDialog1.FileName);
kg_cm_um_nodi_rb.Checked = Convert.ToBoolean(f1.ds.Tables["dt_um"].Rows[0][0].ToString());
daN_cm_um_nodi_rb.Checked = Convert.ToBoolean(f1.ds.Tables["dt_um"].Rows[0][1].ToString());
daN_m_um_nodi_rb.Checked = Convert.ToBoolean(f1.ds.Tables["dt_um"].Rows[0][2].ToString());
kN_m_um_nodi_rb.Checked = Convert.ToBoolean(f1.ds.Tables["dt_um"].Rows[0][3].ToString());
...................
come detto la parte sotto (riempimento di datigriview) non è stati inserta qui in quanto i dati venivano
inseriti più volte (non capisco perchè) e questa parta è stata spostata nella form principale
/*
//FORM AZIONI - IMP AZIONI - DGV VISIBILE
if (ds.Tables["dgv_imp_az"] != null)
{
azioni_imp_dgv.Rows.Clear();
foreach (DataRow posiz in ds.Tables["dgv_imp_az"].Rows)
{
int n = azioni_imp_dgv.Rows.Add();
azioni_imp_dgv.Rows[n].Cells[0].Value = posiz[0].ToString();
azioni_imp_dgv.Rows[n].Cells[1].Value = posiz[1].ToString();
azioni_imp_dgv.Rows[n].Cells[2].Value = posiz[2].ToString();
azioni_imp_dgv.Rows[n].Cells[3].Value = posiz[3].ToString();
azioni_imp_dgv.Rows[n].Cells[4].Value = posiz[4].ToString();
azioni_imp_dgv.Rows[n].Cells[5].Value = posiz[5].ToString();
azioni_imp_dgv.Rows[n].Cells[6].Value = posiz[6].ToString();
}
}
*/
}
Adesso se lancio il programma e vado ad aprire il file, si genera errore e mi vengono copiati nella datagridview più volte gli stessi dati
anche se ho pulito prima dell'apertura il dataset (ds.Clean()), stessa cosa con ds. Tables.Clean()
mentre se inserisco DataSet ds = new DataSet(), i dati vengono caricati correttamente (sia nei datagridview che nei textbox), ma andando a riaprire dopo la prima volta un nuovo file (salvato precedentemente) questo non vie aperto correttamente (non vengono generati errori ma i dati inseriti nelle caselle di testo non sonno corretti)
Di seguito il codice (presente sempre nella form principale) che mi aprire senza errori il primo file, ma non mi permette l'apertura corretto di un secondo dopo il primo.
private void ds_apri()
{
DataSet ds = new DataSet();
ds.ReadXml(openFileDialog1.FileName);
................
altri richiami a form
.............
az.apri_azioni();
//APERTURA DATAGRIDVIEW VARI
//FORM AZIONI - IMP AZIONI
if (ds.Tables["dgv_imp_az"] != null)
{
az.azioni_imp_dgv.Rows.Clear();
foreach (DataRow posiz in ds.Tables["dgv_imp_az"].Rows)
{
int n = az.azioni_imp_dgv.Rows.Add();
az.azioni_imp_dgv.Rows[n].Cells[0].Value = posiz[0].ToString();
az.azioni_imp_dgv.Rows[n].Cells[1].Value = posiz[1].ToString();
az.azioni_imp_dgv.Rows[n].Cells[2].Value = posiz[2].ToString();
az.azioni_imp_dgv.Rows[n].Cells[3].Value = posiz[3].ToString();
az.azioni_imp_dgv.Rows[n].Cells[4].Value = posiz[4].ToString();
az.azioni_imp_dgv.Rows[n].Cells[5].Value = posiz[5].ToString();
az.azioni_imp_dgv.Rows[n].Cells[6].Value = posiz[6].ToString();
}
}
...........
più altri richiami a form
}
Spero di essere stato chiaro e chiedo come poter risolvere il problema potendo aprire correttamente i file che voglio di seguito senza dover riavviare il programma e non avendo errori o copie degli stessi dati nelle datagriview.
Sarebbe utile avere indicazioni su come poter fare per poter inserire il riferimento all'aperture dei vari datagridview non nella form principale, ma in quella secondaria (per intenderci vorrei che i dati da aprire dei datagridview siano presenti in void apri_azioni della form azioni e non in void ds_apri della form principale, senza che questi vengano inseriti più volte uguali nella datagrid)
Grazie anticipate a tutti