在c#中序列化和反序列化Datagridview数据
本文关键字:反序列化 Datagridview 数据 序列化 | 更新日期: 2023-09-27 18:06:45
如何在c#中序列化Datagridview数据?
我最近面临序列化DataGridView的需要,但是我还没有找到关于如何解决这个需求的客观答案。我知道DataGridView是一个视图,而不仅仅是数据。因此,经过思考和测试,我得到了一个实用的解决方案,快速且非常简单,这对我来说已经足够了,其优点是能够记录和检索出现在DataGridView列中的任何类型的对象,例如图像:
- 保存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序列化器来实现它。但在我看来,这是一个错误的方法。
坚持序列化数据并重新填充视图。