2010-07-07 28 views
6

我有一個複雜的表單,允許用戶配置我的應用程序。如何保存/恢復程序運行之間的窗體和控件?

什麼是最好的方式來保存表格狀態&當程序下次運行時重新加載。

我的意思的文字,他在列表框,組合/列表/收音機的所選項目已經進入,一個複選框是否頰等

+3

我假設你使用WinForms,但我不應該猜測。另外,請不要在標題中複製標籤。 – 2010-07-07 03:10:55

+2

+1,因爲你正試圖幫助我。是的WinForms。對不起,你不得不猜測,現在我已經使用了VB超過5小時 - 總的時間 - 有些東西對我來說還是新的;-)。 – Mawg 2010-07-07 06:45:36

+1

@mawg,你能否詳細說明 - 我將你的問題解讀爲*「我有一個包含各種配置設置的表單,我希望每次打開表單時都預先填充正確的值」*。或者你問*「我如何保存下一次任何特定表單的當前狀態」*?你是否想要保存應用程序配置,或只是一些會話類型的東西?其他答覆者似乎讀了你的問題與我所做的不同。 – slugster 2010-07-07 10:16:01

回答

3

很多人在這裏告訴我,當保存,但不是很多,告訴我怎麼...

在我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

啊,手動:-(我希望能夠將表單流式傳輸到一個文件並再次返回。這樣我就必須編寫代碼並將其更改兩次if任何控制都被添加,刪除或更改 – Mawg 2010-07-07 03:12:16

1

你在哪裏保存輸入設置的幾個選項 - 在配置文件或註冊表中,可能是一個數據庫(甚至可能是「雲」,但我不會去那裏)。

在保存設置之前,您應該讓用戶執行特定的操作(例如點擊應用按鈕) - 當用戶關閉表單時,您不應該保存設置,因爲這最終不會好用戶體驗。

如何持續保存設置完全取決於您 - 您可以將它們保存到一個直接的名稱/值對樣式配置文件中,您可能希望在配置文件中使用XML,或者將它們保存爲鍵和值在註冊表中的一個已知位置(或者您可以將名稱/值對保存到數據庫表中)。

當您的應用程序下次運行時,其中一個啓動任務可以檢查設置的已知位置(無論是註冊表還是配置文件),然後將它們加載到設置類中。確保每個設置都有合乎邏輯的默認值,以防從未設置過或由於某種原因無法再讀取。然後可以將設置類傳遞給每個表單,以便應用任何設置相關的,或者它可能是一個靜態類(全局可見的單個實例類),以便它可以從應用程序中的任何位置讀取。

編輯:在閱讀您的評論到另一個答案後,這裏是另一個選項,稍微更先進。使用前面提到的設置類,也可以使用綁定 - 您可以將設置對象直接綁定到表單,所以輸入的任何值都將直接更新到設置對象中,而無需編寫代碼來完成它(只要使用兩個雙向綁定)。 「流媒體」可以通過將設置對象序列化到文件(或數據庫)來實現,我建議你看看。

0

我實際上有幾個通用的例程,我用這個來保存表單大小/位置和ListView列設置。所以,我有類似...

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 

的我參數(對於ListView例程)被用於創建的值保存到註冊表的關鍵。你面前有各種各樣的選擇。您可以將此功能放入所有窗體的基類中,創建SaveState類,或者將例程粘貼到模塊中。你可以將這些數據保存到註冊表,數據庫,文本文件中。你可以有一個通用的例程,通過Controls集合尋找文本框,複選框等。

但是,一旦你創建了一組有用的保存例程,你就可以將它們應用到任何後續的表單中,你只需要做一次辛苦的工作。

0

我也同意在創建表單/關閉應用程序時調用LoadSettings/SaveSettings函數集。

作爲應用程序設置的商店位置,我推薦使用Isolated Storage

作爲補充,根據您在表單上使用的控件,您可以選擇以XML格式保存其狀態,然後再次恢復。 例如Infragistics控件提供了這種可能性(例如UltraDockManager,UltraToolbarManager有一對SaveAsXml/LoadFromXml函數)。

1

序列化表單。

實現ISerializable,並在可序列化構造函數和GetObject()方法中加載/保存字段。

OnClosing序列化窗體。

/// 
    /// 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

你可以以隱藏的方式以隱藏的方式將所有內容保存在隱藏的textbox中。 當用戶點擊apply按鈕時,自動打開文本文件並使程序逐行讀取它。

實施例:

  • 行1可以是圖像
  • 2號線的位置可能是一個文本框
  • 3號線可以是一個詞或程序使用,以確定數字的文本如果一個 複選框是真或假
+0

您只是在轉移問題,OP現在必須解決如何寫入和讀取此文本,以及如何寫入和讀取文件。 – 2012-09-21 15:25:13