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

Décembre 2017


[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
Publié par inxday.
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.
Ajouter un commentaire

Commentaires

Commenter la réponse de olixelle
[c#] automation avec word
[c#] Capturer une représentation graphique d'un control