【问题标题】:Serialize and Deserialize Datagridview Data in C#在 C# 中序列化和反序列化 Datagridview 数据
【发布时间】:2014-06-05 08:27:37
【问题描述】:

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

【问题讨论】:

  • DataGridView 显示 content,你必须序列化内容,而不是 DataGridView 本身。如果您想序列化DataGridView 属性(布局、列样式等),请将它们作为内容的一部分。

标签: c# serialization datagridview


【解决方案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];
}

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 是的,我想序列化数据!我该怎么做?我在这里找不到它
    • DataGridView 的数据可以在DataGridView 的DataSource 属性中找到,但该属性是对象。您实际上需要序列化归因于此变量的对象,或者如果使用绑定,则绑定从 DataContext 指向的对象。 &lt;DataGridView DataSource = "{Binding myDataInDataContext}"&gt; .... &lt;/DataGridView/&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2014-01-06
    • 2011-08-26
    • 2016-07-13
    • 2016-11-14
    • 1970-01-01
    相关资源
    最近更新 更多