C#專案使用Properties.Settings儲存陣列
阿新 • • 發佈:2019-01-28
最近專案中遇到一個需要動態新增控制元件的上位機,假如使用固定名字的Settings儲存cookies實在太麻煩。
WPF裡是沒有自帶陣列型別的setting的,所以需要自己新增。
新建一個視窗,拖五個textbox出來。
在Settings.settings裡新增一個tbText 的string
儲存後在解決方案資源管理器裡用XML格式開啟Settings.settings,將string型別改為string[ ] 陣列,儲存
然後開啟Setting.Designer.cs<?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>
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陣列。