[c#] sérializer un listview ( header compris )

[c#] sérializer un listview ( header compris )

Introduction

Bonjour,

Voici donc un moyen simple de Sérializer/DéSérializer un contrôle listview (contenu et titre des colonnes).

Pour essayer cette métode, il suffit d'avoir une liste appellée listView1 (que vous remplirez comme bon vous semble ) et deux boutons... Voici le code relatif aux boutons de sérialization et désérialization. Les données sont stockées dans un fichier nommé Donnee.ser.

sérialisation

private void SerializBtn_Click(object sender, EventArgs e)
{
   //// Sérialisation du contrôle listView1 dans un fichier
   // On prépare le travail
   FileStream MonFS = File.Open("Donnee.ser", FileMode.Create,FileAccess.ReadWrite);
   BinaryFormatter MonBF = new BinaryFormatter();
   /// Les entêtes ...
   // On sérialise le nombre de colonnes du listwiew
   MonBF.Serialize(MonFS , listView1.Columns.Count);
   // On sérialise chaque titre de colonne
   for (int i = 0; i < listView1.Columns.Count; i++)
   {
      ColumnHeader MonCH = listView1.Columns[i];
      MonBF.Serialize(MonFS , MonCH.Text);
   }
   /// le corps du listview
   // On sérialise le nombre d'items présent dans le listview
   MonBF.Serialize( MonFS , listView1.Items.Count );
   // On sérialise chaque item
   for( int i = 0; i < listView1.Items.Count; i++ )
   {
      ListViewItem MonLV = listView1.Items[i];
      MonBF.Serialize( MonFS , MonLV );
   }
   // et on ferme le fichier ...
   MonFS.Close();
}

dé-sérialisation

private void DeSerializBtn_Click(object sender, EventArgs e)
{
   //// Desérialise le fichier dans le contrôle listView1
   // On commence par vider le listview au cas ou il ne serait pas vide ...
   listView1.Clear();
   // On prépare le travail
   FileStream MonFS = File.Open("Donnee.ser", FileMode.Open,FileAccess.ReadWrite);
   BinaryFormatter MonBF = new BinaryFormatter();
   /// Récupération des entêtes de colonne
   // 1° le nombre de colonne
   int ColCount = (int)MonBF.Deserialize(MonFS);
   // 2° Le texte de chaque header
   for (int i = 0; i < ColCount; i++)
   {
      /////
      object MonOBJ = MonBF.Deserialize(MonFS);
      String MaSTR = (String)MonOBJ;
      ///// Ce qui reviens à : String MaSTR = (String)MonBF.Deserialize(MonFS); plus court mais moins clair !?
      listView1.Columns.Add(MaSTR, 100, HorizontalAlignment.Left);
      // NB les nouvelles colonnes feront d'office 100 unités de large ... une amélioration récupérerait les dimensions...
   }
   /// Ensuite les items
   // 1° le nombre de ligne ...
   int ItemCount = (int)MonBF.Deserialize(MonFS);
   // 2° le contenu de chaque ligne sous forme d'un listviewitem
   for (int i = 0; i < ItemCount ; i++)
   {
      object MonOBJ = MonBF.Deserialize(MonFS);
      ListViewItem MonLV = (ListViewItem)MonOBJ;
      listView1.Items.Add(MonLV);
   }
     // et on ferme le fichier ...
   MonFS.Close();
}

Voila, normalement ça doit fonctionner. Enfin, si vous remarquez un problème ou une amélioration possible ...

Geoffroy

A voir également
Ce document intitulé « [c#] sérializer un listview ( header compris ) » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous