使用从DataGridView输入的数据序列化DataTable

时间:2009-05-23 19:29:54

标签: c# database datagridview datatable

我想知道是否可以通过DataGridView将数据添加到DataTable并通过序列化将数据保存在DataTable中 - 所有这一切都无需创建底层数据库。一个DataTable足以满足我试图存储的数据量,而且数据库绝对有点过分。

谢谢!

2 个答案:

答案 0 :(得分:1)

我不认为我理解你关于序列化的问题。

如果将DataTable分配给DataGridView DataSource属性,则在表单中输入数据时,它将自动添加到DataTable中。

如果要将数据保存在DB外的DataTable中,则应使用DataTable WriteXml()方法(和ReadXml()来加载数据)。如您所见,数据以xml格式序列化。

答案 1 :(得分:0)

不仅可行,而且相当简单。我正在使用包含数据表的数据集,该数据集使用datagridviews进行输入。 dgv使用bindingsources作为其数据源,bindingsource将数据集作为其数据源,数据表作为datamember。

我将数据集序列化为SQL Server中的varbinary(max)列。

(我在我的业务对象上使用强类型属性,但这应该会给你一个想法)

    '-- Copy dataset to property

    '-- Establish locals
    Dim loFormatter As New BinaryFormatter()
    Dim loStream As New System.IO.MemoryStream()

    '-- Serialize the business object
    loFormatter.Serialize(loStream, Me.DsPolicies1)


    '-- Return the created stream
    Me.PoliciesBO1.Dataset_Bytes = loStream.ToArray()

导航策略记录时,将对该属性进行反序列化

      If Me.PoliciesBO1.Count > 0 And Me.PoliciesBO1.CurrentRowIndex >= 0 Then

            Me.clear_bindingsources()

            Dim loformatter As New BinaryFormatter()
            Dim lomemorystream As MemoryStream = _
               New MemoryStream(Me.PoliciesBO1.Dataset_Bytes, 0, _
               Me.PoliciesBO1.Dataset_Bytes.Length, True)

            Me.DsPolicies1 = _
                  CType(loformatter.Deserialize(lomemorystream), dsPolicies)

            '-- Rehook datasource 

            Me.rehook_Bindingsources()

            Me.refresh_dgvs()

最后两个sub只是重置每个表的bindingsource数据源和datamember,然后刷新每个dgv

(我使用这些来收集数据以填写PDF表格)

唯一棘手的部分是记住数据源必须在新记录上为空,并且必须在“父”记录指针移动后从数据中完全重新加载。