Salvataggio e apertura file da form particolare

di il
6 risposte

Salvataggio e apertura file da form particolare

E' da circa un mesetto che mi sto cimentando con la programmazione in c# ho trovato su internet un codice abbastanza comodo che mi permette data una tabcontrol di aggiungere il numero di tab che voglio con all'interno una form presente nel programma, ripetendola tal quale, che posso modificare in maniera indipendente dalle altre. Quello che viene inserito nella tabcontrol è una copia di tutto quello che è contenuto nel panel1 della form secondaria. Il problema che ho è quello del salvataggio dei dati di tutte le form che vengono create successivamente all'apertura del programma da me a partire dalla from base e successivamente l'aperture del file salvato in cui cono presenti un certo numero di form che non ci sono all'apertura del programma e che andrebbero create.
Di seguito posto le istruzioni che mi permettono di creare quante copie voglio nella tabcontrol della form1 del contenuto di ciò che si trova nel panel della from2
 public class MyTabPage : TabPage
    {
        private Form frm;
        public MyTabPage(MyFormPage frm_contenuto)
        {
            this.frm = frm_contenuto;
            this.Controls.Add(frm_contenuto.pnl);
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                frm.Dispose();
            }
            base.Dispose(disposing);
        }
    }

    public class MyFormPage : Form
    {
        public Panel pnl;
    }

Questo componente si chiama MyTabPage

nella from iniziale ho due pulsanti che mi permettono di aggiungere ed eliminare tabpage (inserisco di seguito il codice per l'aggiunta, dato che è quello che potrebbe essere più utile per i consigli)
 schede_solaio_tab.TabPages.Add(new MyTabPage(new carichi_solaio_form()));
            int i = schede_solaio_tab.TabCount;         //ottimizzazione per permettere di selezionare immediatamente l'ultima scheda aggiunta
            schede_solaio_tab.SelectedIndex = i - 1;
            schede_solaio_tab.TabPages[i - 1].Text = "Solaio " + i.ToString("00");


cliccando quindi sul pulsante aggiungi del form principale quello che viene fatto è copiare la fom2 (che nello specifico si chiama carichi_solaio_form) che contiene una serie di caselle di testo e datagridview, aggiungendo ad ogni pressione il contenuto del from2 o meglio tutto ciò che si trova nel pannello del form 2), all'interno di un diverso tab della form1
Inserisco per far capire meglio anche la parte iniziale del codice del form2 (carichi_solai_forma che è MyFormPage, e non Form come nel caso generale)
  public partial class carichi_solaio_form : MyFormPage

    {
        public carichi_solaio_form()
        {
            InitializeComponent();
            this.pnl = panel1_carichi;
        }
di seguito saranno presenti tutti i controlli, pulsanti e funzioni tipici di una normale form (se volete posso postarli ma per ora non lo faccio perchè lunghi)

Se si tratta di salvare ed aprire poi i dati di una singola form o comunque una alla volta, non ho problemi. Salvo i dati come xml passando le texbox e le datagriview per datatable come di seguito
 //dataset per caselle di testo
 	 DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            dt.TableName = "dati_tb1";
            dt.Columns.Add("00ck");
            dt.Columns.Add("01ck"); 
            dt.Columns.Add("02tb"); 
            ds.Tables.Add(dt);

            DataRow row = ds.Tables["dati_tb1"].NewRow();
            row["00ck"] = trave_princ_f1_chb.Checked.ToString();     
            row["01ck"] = trave_sec_f1_chb.Checked.ToString();      
            row["02tb"] = tipo_tp_f1_tb.Text;                   
            ds.Tables["dati_tb1"].Rows.Add(row);
            
             //creo un dataset per il datagridview
            DataTable dt1 = new DataTable();
            dt1.TableName = "dgv1";
            dt1.Columns.Add("desc");
            dt1.Columns.Add("s");
            dt1.Columns.Add("gamma");
            dt1.Columns.Add("GmqC");
            dt1.Columns.Add("Gmq");
            dt1.Columns.Add("tipo");
            ds.Tables.Add(dt1);

            foreach (DataGridViewRow r in dati_carichi_Gdis_gv.Rows)
            {
                DataRow row1 = ds.Tables["dgv1"].NewRow();

                if(r.Cells[0].Value == null)    //controllo sulla prima riga non nullo per evitare blocco programma
                    row1["desc"] = "-";
                else
                    row1["desc"] = r.Cells[0].Value.ToString();

                row1["s"] = r.Cells[1].Value.ToString();
                row1["gamma"] = r.Cells[2].Value.ToString();
                row1["GmqC"] = r.Cells[3].Value.ToString();
                row1["Gmq"] = r.Cells[4].Value.ToString();
                row1["tipo"] = r.Cells[5].Value.ToString();
                ds.Tables["dgv1"].Rows.Add(row1);
            }
              ds.WriteXml(saveFileDialog_sol.FileName); 

questo per il salvataggio.
Mentre per l'apertura file
 DataSet ds = new DataSet();
            //ds.ReadXml(@"D:\data.xml");
            ds.ReadXml(openFileDialog_sol.FileName);

            //associo alle caselle di testo il richiamo alle caselle corrispondenti riga [0] colonna [i]
            trave_princ_f1_chb.Checked = Convert.ToBoolean(ds.Tables["dati_tb1"].Rows[0][0].ToString());
            trave_sec_f1_chb.Checked = Convert.ToBoolean(ds.Tables["dati_tb1"].Rows[0][1].ToString());
            tipo_tp_f1_tb.Text = ds.Tables["dati_tb1"].Rows[0][2].ToString();
            
             if (ds.Tables["dgv1"] != null)
            {
                foreach (DataRow posiz in ds.Tables["dgv1"].Rows)
                {
                    int n = dati_carichi_Gdis_gv.Rows.Add();
                    dati_carichi_Gdis_gv.Rows[n].Cells[0].Value = posiz[0].ToString();
                    dati_carichi_Gdis_gv.Rows[n].Cells[1].Value = posiz[1].ToString();
                    dati_carichi_Gdis_gv.Rows[n].Cells[2].Value = posiz[2].ToString();
                    dati_carichi_Gdis_gv.Rows[n].Cells[3].Value = posiz[3].ToString();
                    dati_carichi_Gdis_gv.Rows[n].Cells[4].Value = posiz[4].ToString();
                    dati_carichi_Gdis_gv.Rows[n].Cells[5].Value = posiz[5].ToString();
                }
            }
            
così naturalmente per tutto quello che è contenuto nella form2.
In questo modo ho la possibilità di salvare il contenuto della singola form.

Il problema è che vorrei salvare non un dato alla volta (form per form), ma salvare tutto assieme, ossia se nella form1 ho aggiunto 4 form2, con dati diversi (es carichi solai piano terra, carichi solai piano 1, ecc. tutti diversi) vorrei salvare tutti i dati assieme e riaprendo il file vorrei che si riformassero le tab salvate.
Il primo problema è che queste form vengono crete da 0 dopo l'apertura del file quindi non so come associare il loro contenuto come fatto per la form singola, inoltre tutti gli elementi hanno lo stesso nome, ma sono presenti nelle varie tabpage, non da subito ma dopo l'apertura del file.
Chiedo quindi gentilmente consigli a chi è più esperto di me per poter risolvere la cosa sia per il salvataggio che per l'apertura del file salvato.
Grazie

6 Risposte

  • Re: Salvataggio e apertura file da form particolare

    Secondo me devi progettare un db, con tutte le tabelle e i campi che ti servono per memorizzare un intero "progetto". Così potrai registrare tutto quello che fai, passo per passo e avrai modo di rileggere tutto con apposite query. Non è semplice ma mu sembra l'unico modo sensato.
  • Re: Salvataggio e apertura file da form particolare

    Non si riesce con una soluzione tipo quello di esportazione in xml come fatto per i singoli form?
  • Re: Salvataggio e apertura file da form particolare

    Altro problema il progetto varia da condizione a condizione, e non so a priori come, inoltre i riferimenti hanno sempre lo stesso nome e possono essere 1 o 10 o non so perchè il numero di schede può essere alto
  • Re: Salvataggio e apertura file da form particolare

    Non importa .... Hai la possibilità di inserire quanti record vuoi ...
  • Re: Salvataggio e apertura file da form particolare

    Grazie delle info ma dato che devo approfondire la creazione e strutturazione di db, volevo chiedere se era possibile una soluzione con quello che ho a disposizione ossia i form ed il salvataggio dei singoli form. Magari applicando qualche ciclo che mi permetta di unire quello che già ho.
  • Re: Salvataggio e apertura file da form particolare

    Io non lo farei, non ti posso consigliare cose che non farei.
Devi accedere o registrarti per scrivere nel forum
6 risposte