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.
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(); }
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