Problemi con codice apertura file

di il
2 risposte

Problemi con codice apertura file

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

2 Risposte

  • Re: Problemi con codice apertura file

    Il fatto è che non si può provare tutto semplicemente riproducendo il codice. È necessario avere un progetto da scaricare e provare di persona. In caso contrario non credo avrai molte risposte...
  • Re: Problemi con codice apertura file

    Grazie comunque avevo indicato tutti i passaggi perchè credevo fosse più facile così trovare il problema, in ogni caso ho risolto il problema.
    l'errore stava nel richiamare ad ogni form ds.ReadXml(openFileDialog1.FileName); inoltre la condizione che non mi faceva aprire oltre il primo file era
    DataSet ds = new DataSet(); una nuova istanza che poi non permetteva agli altri elementi di essere richiamati correttamente.
    riporto di seguito la condizione corretta che potrebbe essere utile per altri che leggono il forum
    Nella form principale in ds_apri occorre inserire
     private void ds_apri()
               { ds.ReadXml(openFileDialog1.FileName);
                ................
                altri richiami a form
                .............
                az.apri_azioni();
                
                i datagrid possono essere inseriti nelle form secondarie
                }
    Nelle form secondarie vanno messi solo il richiamo al posizionamento dei dati salvati senza richiamare prima null'altro
     
              
                ................
                altri richiami a form
                .............
                az.apri_azioni();
Devi accedere o registrarti per scrivere nel forum
2 risposte