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

本文关键字:反序列化 Datagridview 数据 序列化 | 更新日期: 2023-09-27 18:06:45

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

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

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

  1. 保存dataridview数据:

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)保存对象数组(二进制在我的情况下,使用Dainel Schroeder的伟大解决方案,从里贾纳,SK,加拿大):

BinarySerialization.WriteToBinaryFile<object[,]>(pathAndNameToObjectsArray, dataGridViewObjectsArray);
  • 恢复DataGridView数据:
  • 2.1)恢复二进制保存的对象数组(使用同样伟大的解决方案从Dainel Schroeder,从Regina, SK,加拿大):

    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];
    }
    

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

    你回答了你自己的问题:输入"System.Windows.Forms"。DataGridView' in Assembly 'Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'未被标记为可序列化的。你不能序列化DataGridView,因为它在框架中没有被标记为可序列化的。

    你可以尝试创建一个与DataGridView完全相同的控件,并拥有自定义的序列化/反序列化方法,或者用。net序列化器来实现它。但在我看来,这是一个错误的方法。

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