C#项目使用Properties.Settings保存数组

最近项目中遇到一个需要动态添加控件的上位机,假如使用固定名字的Settings保存cookies实在太麻烦。

WPF里是没有自带数组类型的setting的,所以需要自己添加。

 

新建一个窗口,拖五个textbox出来。

C#项目使用Properties.Settings保存数组_第1张图片

在Settings.settings里添加一个tbText 的string

保存后在解决方案资源管理器里用XML格式打开Settings.settings,将string类型改为string[ ] 数组,保存

 



  
  
    
      
    
  

然后打开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里新建完变量后就不要再动他了。

还有一点就是二维数组可以新建并读取到,但是保存不了。


嗯,写完程序后发现该默认的Settings.settings是分“用户态”,“应用程序态”的,意思就是本地的根目录的配置拷到别的机器上还是默认的配置,不够“绿色”啊。

研究一下,发现是可以用App.config的,该配置会每次修改完都更新一下根目录下的exe.config,正是我想要的。

该App.config的写法跟自带的exe.config是大同小异的,一个XML。

唯一一点不好的是,貌似只能保存string。

所以所有的配置都需要转成string格式保存罗。

提供一下需要用到的函数以作备忘:

 

str = string.Join("^", strAryVal);
strAry = str.Split('^');

用这两函数可以实现数组的序列化和反序列化,说白了就是将一个string数组打包成一个string,中间用"^"隔开,下次用的时候将一个string拆分成一个string数组。
 

更新一下,保存到exe.config里我感觉有点误导大家了,保存到.ini里会更符合大众习惯。

#region --INI method--

[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string value, string filePath);

[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);


#region WriteIni
public void WriteIni(string section, string key, string value, string filePath)
{
    WritePrivateProfileString(section, key, value, filePath);
}
#endregion

#region ReadIni
public string ReadIni(string section, string key, string filePath)
{
    StringBuilder temp = new StringBuilder(1024);
    int ret = GetPrivateProfileString(section, key, "", temp, 1024, filePath);
    return temp.ToString();
}
#endregion

#region DeleteSection
public void DeleteSection(string section, string filePath)
{
    WritePrivateProfileString(section, null, null, filePath);
}
#endregion

#region DeleteKey
public void DeleteKey(string section, string key, string filePath)
{
    WritePrivateProfileString(section, key, null, filePath);
}
#endregion

#endregion

 

你可能感兴趣的:(WPF)