1. 程式人生 > >C#專案使用Properties.Settings儲存陣列

C#專案使用Properties.Settings儲存陣列

最近專案中遇到一個需要動態新增控制元件的上位機,假如使用固定名字的Settings儲存cookies實在太麻煩。

WPF裡是沒有自帶陣列型別的setting的,所以需要自己新增。

新建一個視窗,拖五個textbox出來。


在Settings.settings裡新增一個tbText 的string


儲存後在解決方案資源管理器裡用XML格式開啟Settings.settings,將string型別改為string[ ] 陣列,儲存

<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="ts03.Properties" GeneratedClassName="Settings">
  <Profiles />
  <Settings>
    <Setting Name="tbText" Type="System.String[]" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
  </Settings>
</SettingsFile>
然後開啟Setting.Designer.cs
public Settings()
{
    if (this.tbText == null)
        this.tbText = new string[] { "1", "2", "3", "4", "5" };
}
        

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public string[] tbText {
    get {
        return ((string[])(this["tbText"]));
    }
    set {
        this["tbText"] = (string[])value;
    }
}

然後主窗體就可以呼叫了。
private void Form_Init()
{
    for(int i = 0 ;i<5;i++)
    {
        string tbStr = "textBox" + (i + 1).ToString();
        Control col = this.Controls.Find(tbStr, true)[0];
        TextBox tbHandle = col as TextBox;
        tbHandle.Text = Properties.Settings.Default.tbText[i];
    }
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    for (int i = 0; i < 5; i++)
    {
        string tbStr = "textBox" + (i + 1).ToString();
        Control col = this.Controls.Find(tbStr, true)[0];
        TextBox tbHandle = col as TextBox;
        Properties.Settings.Default.tbText[i] = tbHandle.Text;
    }
    Properties.Settings.Default.Save();
}

需要注意的是Setting.Desinger.cs 裡的程式碼會跟隨Properties.Settings更改而被覆蓋。

所以要麼備份好Setting.Desinger.cs,要麼在Settings.settings裡新建完變數後就不要再動他了。

還有一點就是二維陣列可以新建並讀取到,但是儲存不了。

<!--------------------更新 20170702--------------------------->
嗯,寫完程式後發現該預設的Settings.settings是分“使用者態”,“應用程式態”的,意思就是本地的根目錄的配置拷到別的機器上還是預設的配置,不夠“綠色”啊。

研究一下,發現是可以用App.config的,該配置會每次修改完都更新一下根目錄下的exe.config,正是我想要的。

該App.config的寫法跟自帶的exe.config是大同小異的,一個XML。

唯一一點不好的是,貌似只能儲存string。

所以所有的配置都需要轉成string格式儲存羅。

提供一下需要用到的函式以作備忘:

str = string.Join("^", strAryVal);
strAry = str.Split('^');
用這兩函式可以實現陣列的序列化和反序列化,說白了就是將一個string陣列打包成一個string,中間用"^"隔開,下次用的時候將一個string拆分成一個string陣列。