【发布时间】:2014-06-05 08:27:37
【问题描述】:
如何在 C# 中序列化 Datagridview 数据?
【问题讨论】:
-
DataGridView显示 content,你必须序列化内容,而不是DataGridView本身。如果您想序列化DataGridView属性(布局、列样式等),请将它们作为内容的一部分。
标签: c# serialization datagridview
如何在 C# 中序列化 Datagridview 数据?
【问题讨论】:
DataGridView 显示 content,你必须序列化内容,而不是 DataGridView 本身。如果您想序列化DataGridView 属性(布局、列样式等),请将它们作为内容的一部分。
标签: c# serialization datagridview
我最近面临序列化 DataGridView 的需求,但是我在这里没有找到关于如何解决这个需求的客观答案。我知道 DataGridView 是一个视图,而不仅仅是数据。因此,经过思考和测试,我得到了一个实用的解决方案,快速且非常简单,对我来说,这已经足够了,其优点是能够记录和检索出现在 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);
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];
}
【讨论】:
序列化用于数据,它应该能够序列化。您正在尝试序列化视图,其目的是向用户显示数据。 您实际需要做的是序列化填充 DataGridView 的数据。
OT 您回答了自己的问题:在程序集“System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中键入“System.Windows.Forms.DataGridView”未标记为可序列化。 您无法序列化 DataGridView,因为它在框架中未标记为可序列化。
您可以尝试创建一个与 DataGridView 完全相同的控件,并具有自定义的 Serialize/Deserialize 方法,或者以可以使用 .NET 序列化程序对其进行序列化的方式实现它。但恕我直言,这是一种错误的做法。
坚持序列化数据并重新填充视图。
【讨论】:
<DataGridView DataSource = "{Binding myDataInDataContext}"> .... </DataGridView/>