我有一个DataGridView
列,我需要在我的表单关闭时存储此DataGridView
的列名,宽度和颜色属性,并在加载表单时还原它们。
我应该为此目的使用应用程序设置(Settings.settings文件)还是我应该使用另一个文件?
如果我选择存储在应用程序设置中,我该如何序列化这些信息?
数据示例:
class ColumnInfo
{
public string Name { get; set; }
public int Width { get; set; }
public Color BackColor { get; set; }
}
List<ColumnInfo> needToStore;
答案 0 :(得分:0)
我没有考虑序列化到某个文件或数据库的情况。只是应用设置。您可以将数据存储为建议类型中的string
或StringCollection
。首先决定是从XmlSerializer
,BinaryFormatter
,protobuf甚至是DataContractSerializer
中选择序列化类型。第二个是如何将字节数组转换为字符串(base64或某些编码)。
仅用于xml序列化的代码,其余的格式化程序类似(见图片):
var xs = new XmlSerializer(typeof(List<ColumnInfo>));
xs.Serialize(ms, needToStore);
Properties.Settings.Default.String = Convert.ToBase64String(ms.ToArray());
Properties.Settings.Default.Save();
反序列化,例如二进制格式化程序:
byte[] bytes=Convert.FromBase64String(Properties.Settings.Default.String);
using (MemoryStream ms = new MemoryStream(bytes))
{
BinaryFormatter bf = new BinaryFormatter();
return (List<ColumnInfo>)bf.Deserialize(ms);
}
如果您选择System.Collections.Specialized.StringCollection
而不是System.String
作为数据的容器,那么您必须从ColumnInfo
来回string
:
public static explicit operator string (ColumnInfo ci) { return ci.ToString(); }
public static explicit operator ColumnInfo(string s) { return ColumnInfo.FromString(s); }
序列化如:
foreach (string s in needToStore.Select(ci => (string)ci))
{
if (! Properties.Settings.Default.StringCollection.Contains(s))
Properties.Settings.Default.StringCollection.Add(s);
}
反序列化:
List<ColumnInfo> columnsInfo = new List<ColumnInfo>();
foreach (string s in Properties.Settings.Default.StringCollection)
{
columnsInfo.Add((ColumnInfo)s);
}