在C#中序列化和反序列化Datagridview数据

时间:2014-06-05 08:27:38

标签: c# serialization datagridview

如何在C#中序列化Datagridview数据?

2 个答案:

答案 0 :(得分:1)

我最近遇到了序列化 DataGridView 的需求,但我还没有在这里找到关于如何解决这个需求的客观答案。我知道 DataGridView 是一个视图,而不仅仅是数据。所以,经过思考和测试,我得到了一个实用的解决方案,快速且非常简单,这对我来说已经足够了,优点是能够记录和检索出现在 DataGridView 列中的任何类型的对象,例如图片:

  1. 保存 DataGridView 数据:

1.1) 创建一个与 DataGridView 具有相同维度的对象的二维数组:

object[,] dataGridViewObjectsArray = new object[myDataGridView.Rows.Count, myDataGridView.Columns.Count];

1.2) 将DataGridView的每一行每一列转移到对象数组中的相同位置:

for (int x = 0; x < myDataGridView.Rows.Count; x++)
    for (int y = 0; y < myDataGridView.Columns.Count; y++)
        dataGridViewObjectsArray[x, y] = myDataGridView.Rows[x].Cells[y].Value;

1.3) 保存对象数组(在我的情况下为二进制,使用来自加拿大 SK 里贾纳的 Dainel Schroeder 的出色解决方案):

BinarySerialization.WriteToBinaryFile<object[,]>(pathAndNameToObjectsArray, dataGridViewObjectsArray);
  1. 恢复 DataGridView 数据:

2.1) 恢复二进制保存的对象数组(使用来自加拿大 SK 里贾纳的 Dainel Schroeder 的同样出色的解决方案):

object[,] dataGridViewObjectsArray = BinarySerialization.ReadFromBinaryFile<object[,]>(pathAndNameToObjectsArray);

2.2) 清空 DataGridView 行:

myDataGridView.Rows.Clear();

2.3) 为对象数组中的每一行在DataGridView 中添加一个空行,并将对象数组的每一列回传到DataGridView 中的相同位置:

for (int x = 0; x < dataGridViewObjectsArray.GetLength(0); x++)
{
    myDataGridView.Rows.Add();
    for (int y = 0; y < dataGridViewObjectsArray.GetLength(1); y++)
        myDataGridView.Rows[x].Cells[y].Value = dataGridViewObjectsArray[x, y];
}

答案 1 :(得分:0)

序列化用于数据,它应该能够序列化。您正在尝试序列化视图,其目的是向用户显示数据。 您实际需要做的是序列化填充DataGridView的数据。

OT您回答了自己的问题:在Assembly'System.Windows.Forms中输入'System.Windows.Forms.DataGridView',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为可序列化。 您无法序列化DataGridView,因为它未在框架中标记为可序列化。

您可以尝试创建一个与DataGridView完全相同的Control,并使用自定义Serialize / Deserialize方法或以可以使用.NET序列化程序序列化的方式实现它。但这是一种错误的做法恕我直言。

坚持序列化数据并重新填充视图。