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