2010-07-07 18 views
6

Ho un modulo complesso per consentire all'utente di configurare la mia app.come salvare/ripristinare un modulo e controllare tra le esecuzioni del programma?

Qual è il modo migliore per salvare lo stato del modulo & ricaricare quando si esegue il programma successivo.

intendo testo è entrato in caselle di riepilogo, l'elemento selezionato di combo/list/radio, se una casella di controllo è guance, etc

+3

Suppongo che tu stia utilizzando WinForms, ma non dovrei indovinare. Inoltre, per favore non duplicare i tag nel titolo. –

+2

+1 poiché stai cercando di aiutarmi. Sì, WinForms. Mi dispiace che tu abbia dovuto indovinare, ora utilizzo VB da poco più di 5 ore - tempo trascorso totale - alcune cose sono ancora nuove per me ;-). – Mawg

+1

@mawg, puoi elaborare - ho letto la tua domanda come * "ho un modulo contenente varie impostazioni di configurazione che voglio precompilare sul valore corretto ogni volta che il modulo è aperto" *. O stai chiedendo * "come faccio a salvare lo stato corrente di un particolare modulo per la prossima volta" *? Stai cercando di salvare la configurazione dell'applicazione o solo alcuni tipi di sessione? Gli altri rispondenti sembrano aver letto la tua domanda in modo diverso da quello che ho fatto. – slugster

risposta

3

Un sacco di persone qui a dirmi quando per salvare, ma non molti a dirmi come ...

Alla fine sono andato con WritePrivateProfileString()

0
Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing 

    ' save all the values you want' 

End Sub 

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load 

    If SaveSettingsExist Then 
     ' restore all the values you want' 
    End If 

End Sub 
+0

Ah, manualmente :-(Spero che qualcosa come lo streaming del modulo in un file e viceversa. In questo modo devo scrivere il codice e cambiarlo due volte se qualsiasi controllo è aggiunto, rimosso o modificato – Mawg

1

Hai alcune opzioni di dove salvare le impostazioni immesse - in un file di configurazione, o nel registro, forse un database (forse anche "il cloud", ma non ci andrò).

Si dovrebbe avere l'utente effettuare un'azione specifica (ad esempio, facendo clic su un pulsante Applica) prima di salvare le impostazioni - non si deve solo salvare le impostazioni quando l'utente chiude la forma, visto che non è in ultima analisi, buona UX.

Come si mantengono le impostazioni totalmente a proprio carico - è possibile salvarle in un file di configurazione stile nome coppia coppia/valore, è possibile utilizzare XML nel file di configurazione o salvarle come chiavi e valori in un punto noto nel registro (o è possibile salvare coppie nome/valore in una tabella di database).

Quando l'applicazione è prossima, una delle attività di avvio può essere quella di controllare la posizione nota (che si tratti del registro o di un file di configurazione) per le impostazioni e quindi caricarle in una classe di impostazioni. Assicurati di avere valori di default logici per ogni impostazione nel caso in cui non sia mai stato impostato, o per qualche motivo non puoi leggerlo di nuovo. La classe di impostazioni può quindi essere passata a ogni modulo per poter applicare qualsiasi impostazione rilevante, oppure potrebbe essere una classe statica (classe di istanza singola globalmente visibile) in modo che possa essere letta da qualsiasi punto dell'applicazione.

Modifica: dopo aver letto il commento per un'altra risposta, ecco un'altra opzione, leggermente più avanzata. Usa la classe delle impostazioni che ho menzionato prima, ma usa anche il binding: puoi associare il tuo oggetto settings direttamente al tuo modulo, quindi qualsiasi valore inserito verrà aggiornato direttamente nell'oggetto settings senza che tu debba scrivere codice per farlo (a patto che tu usi due modo vincolante). Lo "streaming" può essere ottenuto serializzando l'oggetto impostazioni su un file (o un database), suggerisco di guardare lo .

0

In realtà ho un paio di routine generiche che uso in questo modo per salvare le dimensioni della colonna/posizione e le impostazioni della colonna ListView. Così ho qualcosa di simile ...

Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing 

    SaveFormPos(Me) 
    SaveListview(Me, lvuInvoices) 

End Sub 

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load 

    RestoreFormPos(Me) 
    RestoreListview(Me, lvuInvoices) 

End Sub 

Il parametro Me (per la routine Listview) viene utilizzato per creare una chiave per i valori da salvare al Registro di sistema. Hai tutti i tipi di opzioni di fronte a voi. È possibile inserire questa funzionalità in una classe base per tutti i moduli, creare una classe SaveState o semplicemente inserire procedure in un modulo. È possibile salvare questi dati nel registro, in un database, in file di testo. Si può avere una routine generica che attraversa la collezione Controls cercando TextBox, Checkboxes ecc.

Tuttavia, una volta creato un insieme utile di routine di salvataggio, è possibile utilizzarle su qualsiasi modulo successivo desiderato, quindi hai solo bisogno di fare il duro lavoro una volta.

0

Sono inoltre d'accordo sull'avere un set di funzioni LoadSettings/SaveSettings chiamate durante la creazione del modulo/alla chiusura dell'applicazione.

Come posizione del negozio per le impostazioni dell'applicazione, è consigliabile utilizzare Isolated Storage.

In aggiunta, a seconda dei controlli utilizzati nel modulo, è possibile avere le opzioni di salvare il loro stato in formato XML e ripristinarlo la volta successiva. Ad esempio i controlli Infragistics offrono questa possibilità (ad esempio UltraDockManager, UltraToolbarManager hanno una coppia di funzioni SaveAsXml/LoadFromXml).

1

Serializzare il modulo.

Implementare ISerializable e nel metodo serializzabile costruttore e GetObject() caricare/salvare i campi.

In OnClosing serializza il modulo.

/// 
    /// try to obtain the las serialized main form with old data 
    MainForm mainForm = DeserializeMainForm("mainForm.data"); 
    /// 
    /// if any old data found, create a new(empty) main form 
    if (mainForm == null) mainForm = new MainForm(); 

    static MainForm DeserializeMainForm(string filePath) 
    { 
     MainForm mf = null; 
     FileStream fileStream = null; 
     try 
     { 
      BinaryFormatter binaryFormatter = new BinaryFormatter(); 
      fileStream = new FileStream(filePath, FileMode.Open); 
      mf = (MainForm)binaryFormatter.Deserialize(fileStream); 
     } 
     catch { } 
     finally 
     { 
      if (fileStream != null) 
      { 
       fileStream.Close(); 
      } 
     } 

     return mf; 
    } 

MainForm:

[Serializable] 
public partial class MainForm : Form, ISerializable 
{ 
     protected MainForm(SerializationInfo info, StreamingContext context) 
     : this() 
    { 
     if (info == null) 
      throw new System.ArgumentNullException("info"); 

     this.tbxServerIp.Text = info.GetString("server ip"); 
     this.tbxServerPort.Text = info.GetString("server port"); 
     this.tbxEventFilter.Text = info.GetString("event filter"); 
     this.tbxWallId.Text = info.GetString("wallId"); 

     foreach (Control control in this.Controls) 
     { 
      if (control is EventSender) 
      { 
       EventSender eventSender = (control as EventSender); 
       eventSender.LoadFromSerializationInfo(info); 
      } 
     } 
    } 

    private void SerializeThis() 
    { 
     BinaryFormatter binaryFormatter = new BinaryFormatter(); 
     FileStream fileStream = new FileStream("mainForm.data", FileMode.Create); 
     try 
     { 
      binaryFormatter.Serialize(fileStream, this); 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      fileStream.Close(); 
     } 
    } 

    protected override void OnClosing(CancelEventArgs e) 
    { 
     SerializeThis(); 
     base.OnClosing(e); 
    } 
} 
-1

In qualche modo è possibile salvare tutto in uno textbox nascosto in un modulo nascosto. Quando l'utente fa clic sul pulsante apply, apre automaticamente il file di testo e lo fa leggere riga per riga.

Esempio:

  • Linea 1 potrebbe essere la posizione di un'immagine
  • linea 2 potrebbe essere il testo di una casella di testo
  • Linea 3 potrebbe essere una parola o numero che il programma utilizza per determinare se una casella di controllo è vera o falsa
+0

Stai solo spostando il problema. L'OP ora dovrebbe capire come scrivere e leggere da questo testo e scrivere e leggere da un file. –

Problemi correlati