2009-05-23 4 views
1

Je me demande s'il est possible d'ajouter des données à DataTable via un DataGridView et d'enregistrer les données dans le DataTable en les sérialisant - et tout cela sans avoir à créer une base de données sous-jacente. Un DataTable est suffisant pour la quantité de données que j'essaie de stocker et une base de données est définitivement exagérée.Serializing DataTable avec des données entrées par DataGridView

Merci!

Répondre

1

Je ne pense pas avoir compris votre question sur la sérialisation.

Si vous affectez un DataTable à une propriété DataGridView DataSource, lorsque vous entrez des données dans le formulaire, il sera automatiquement ajouté à DataTable.

Si vous souhaitez conserver les données dans le DataTable en dehors d'un DB, vous devez utiliser la méthode DataTable WriteXml() (et ReadXml() pour charger les données). Comme vous le voyez, les données sont sérialisées au format xml.

+0

D'accord, la sérialisation est une alternative mais j'irais vers WriteXML, peut-être vers un CompressionStream. –

0

Non seulement possible mais assez simple. Je vais juste cela avec un ensemble de données contenant des données qui utilisent datagridviews pour l'entrée. Le dgv utilise bindingsources comme source de données et la source de liaison a l'ensemble de données comme source de données et peut être datamember.

Je sérialise l'ensemble de données à une colonne varbinary (max) dans SQL Server.

(j'utilise des propriétés fortement typées sur mon objet métier, mais cela devrait vous donner l'idée)

'-- 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() 

Lorsque l'enregistrement politique est gouverné, la propriété est désérialisée

 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() 

Le dernier deux sous-réseaux réinitialisent simplement la source de données bindingsource et le datamember pour chaque table, puis actualisent chaque dgv

(je les utilise pour la collecte de données afin de remplir des formulaires PDF) 012 La seule difficulté consiste à se rappeler que la source de données doit être vide sur un nouvel enregistrement et doit être complètement rechargée à partir des données après le déplacement d'un pointeur d'enregistrement "parent".

Questions connexes