2008-10-14 31 views
1

我的Winforms應用程序中有一個名爲Settings.settings的「設置文件」,其中包含自定義方法等的部分類。有沒有基於任意鍵加載/保存動態設置的方法?Winforms - 動態加載/保存設置

例如,我在我的應用程序中有一些ListViews,我想要保存/加載列寬;而不是爲每個列表視圖的每個列創建一個寬度設置,我想要一個簡單的方法自動加載/保存寬度。

下面是我曾嘗試保存方法的一個例子:

internal sealed partial class Settings 
{ 
    public void SetListViewColumnWidths(ListView listView) 
    { 
     String baseKey = listView.Name; 
     foreach (ColumnHeader h in listView.Columns) 
     { 
      String key = String.Format("{0}-{1}", baseKey, h.Index); 
      this[key] = h.Width; 
     } 
    } 
} 

當運行代碼我得到錯誤「設置屬性‘TestsListView-0’沒有被發現。」有什麼我失蹤?

回答

1

將列寬設置存儲在Xml Serializable對象中。即,實現IXmlSerializable然後在Settings.settings中創建該類型的單個設置條目。

一個好的選擇可能是一個Xml序列化字典。快速google search發現了不少博客文章,介紹瞭如何實現該功能。

正如在其他答案中提到的,你需要確保這個對象是一個用戶設置。您可能還需要初始化設置實例。即,創建一個XmlSerializableDictionary()實例,並在設置爲null時將其分配給設置。設置子系統不會創建複雜設置對象的默認實例。

另外,如果你想這些設置集版本(即是可升級),您將需要升級應用程序啓動的設置之間仍然存在。這是在Miha Markič's博客和Raghavendra Prabhu's博客上詳細描述的。

0

我認爲錯誤

設置屬性 的 '鑰匙' 沒有被發現。

發生是因爲'key'值在您的設置文件中不存在(相當明顯)。

據我所知,你不能以編程方式添加設置值,你可能需要調查所有你需要的設置,畢竟,儘管一旦他們在那裏,我想你會能夠使用您提供的代碼來保存更改。

要保存更改,您需要確保它們是'用戶'設置,而不是'應用程序'。

Settings文件是非常簡單的XML,因此您可以通過將XML直接寫入文件來解決問題,但我從來沒有這樣做過,所以無法確定它會工作,或者不一定推薦這種方法。

http://msdn.microsoft.com/en-us/library/cftf714c.aspx是MSDN開始的鏈接。

0

您可以對用戶設置進行Settings.Save()或類似操作,但請注意,您的應用程序目錄中的xxx.exe.config文件不會像您期望的那樣持久保存。他們實際上在用戶文件夾的深處(搜索你的驅動器找到xxx.exe.config)。下一次,您手動更改您的應用程序目錄中的xxx.exe.config,更改將神祕地不適用(系統仍在使用用戶目錄中保存的)。