在哪里以及如何使用首选项列出<myclass>?</myclass>

时间:2014-11-07 21:41:46

标签: c# .net datagridview

我有一个DataGridView列,我需要在我的表单关闭时存储此DataGridView的列名,宽度和颜色属性,并在加载表单时还原它们。 我应该为此目的使用应用程序设置(Settings.settings文件)还是我应该使用另一个文件? 如果我选择存储在应用程序设置中,我该如何序列化这些信息? 数据示例:

class ColumnInfo
{
    public string Name { get; set; }
    public int Width { get; set; }
    public Color BackColor { get; set; }
}

List<ColumnInfo> needToStore;

1 个答案:

答案 0 :(得分:0)

我没有考虑序列化到某个文件或数据库的情况。只是应用设置。您可以将数据存储为建议类型中的stringStringCollection。首先决定是从XmlSerializerBinaryFormatter,protobuf甚至是DataContractSerializer中选择序列化类型。第二个是如何将字节数组转换为字符串(base64或某些编码)。

Serialize list to a string

仅用于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);
  }