我有一個複雜的表單,允許用戶配置我的應用程序。如何保存/恢復程序運行之間的窗體和控件?
什麼是最好的方式來保存表格狀態&當程序下次運行時重新加載。
我的意思的文字,他在列表框,組合/列表/收音機的所選項目已經進入,一個複選框是否頰等
我有一個複雜的表單,允許用戶配置我的應用程序。如何保存/恢復程序運行之間的窗體和控件?
什麼是最好的方式來保存表格狀態&當程序下次運行時重新加載。
我的意思的文字,他在列表框,組合/列表/收音機的所選項目已經進入,一個複選框是否頰等
很多人在這裏告訴我,當保存,但不是很多,告訴我怎麼...
在我WritePrivateProfileString()去年底
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
啊,手動:-(我希望能夠將表單流式傳輸到一個文件並再次返回。這樣我就必須編寫代碼並將其更改兩次if任何控制都被添加,刪除或更改 – Mawg 2010-07-07 03:12:16
你在哪裏保存輸入設置的幾個選項 - 在配置文件或註冊表中,可能是一個數據庫(甚至可能是「雲」,但我不會去那裏)。
在保存設置之前,您應該讓用戶執行特定的操作(例如點擊應用按鈕) - 當用戶關閉表單時,您不應該保存設置,因爲這最終不會好用戶體驗。
如何持續保存設置完全取決於您 - 您可以將它們保存到一個直接的名稱/值對樣式配置文件中,您可能希望在配置文件中使用XML,或者將它們保存爲鍵和值在註冊表中的一個已知位置(或者您可以將名稱/值對保存到數據庫表中)。
當您的應用程序下次運行時,其中一個啓動任務可以檢查設置的已知位置(無論是註冊表還是配置文件),然後將它們加載到設置類中。確保每個設置都有合乎邏輯的默認值,以防從未設置過或由於某種原因無法再讀取。然後可以將設置類傳遞給每個表單,以便應用任何設置相關的,或者它可能是一個靜態類(全局可見的單個實例類),以便它可以從應用程序中的任何位置讀取。
編輯:在閱讀您的評論到另一個答案後,這裏是另一個選項,稍微更先進。使用前面提到的設置類,也可以使用綁定 - 您可以將設置對象直接綁定到表單,所以輸入的任何值都將直接更新到設置對象中,而無需編寫代碼來完成它(只要使用兩個雙向綁定)。 「流媒體」可以通過將設置對象序列化到文件(或數據庫)來實現,我建議你看看。
我實際上有幾個通用的例程,我用這個來保存表單大小/位置和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集合尋找文本框,複選框等。
但是,一旦你創建了一組有用的保存例程,你就可以將它們應用到任何後續的表單中,你只需要做一次辛苦的工作。
我也同意在創建表單/關閉應用程序時調用LoadSettings/SaveSettings
函數集。
作爲應用程序設置的商店位置,我推薦使用Isolated Storage。
作爲補充,根據您在表單上使用的控件,您可以選擇以XML格式保存其狀態,然後再次恢復。 例如Infragistics控件提供了這種可能性(例如UltraDockManager,UltraToolbarManager有一對SaveAsXml/LoadFromXml
函數)。
序列化表單。
實現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);
}
}
你可以以隱藏的方式以隱藏的方式將所有內容保存在隱藏的textbox
中。 當用戶點擊apply
按鈕時,自動打開文本文件並使程序逐行讀取它。
實施例:
您只是在轉移問題,OP現在必須解決如何寫入和讀取此文本,以及如何寫入和讀取文件。 – 2012-09-21 15:25:13
我假設你使用WinForms,但我不應該猜測。另外,請不要在標題中複製標籤。 – 2010-07-07 03:10:55
+1,因爲你正試圖幫助我。是的WinForms。對不起,你不得不猜測,現在我已經使用了VB超過5小時 - 總的時間 - 有些東西對我來說還是新的;-)。 – Mawg 2010-07-07 06:45:36
@mawg,你能否詳細說明 - 我將你的問題解讀爲*「我有一個包含各種配置設置的表單,我希望每次打開表單時都預先填充正確的值」*。或者你問*「我如何保存下一次任何特定表單的當前狀態」*?你是否想要保存應用程序配置,或只是一些會話類型的東西?其他答覆者似乎讀了你的問題與我所做的不同。 – slugster 2010-07-07 10:16:01