Serializzare tutte le proprietà di un combobox

giovedì 30 ottobre 2008 - 15.06

nyoit78 Profilo | Newbie

Ringrazio in anticipo per gli help che mi arriveranno.
Vorrei salvarmi in formato xml tutte le proprità di una form conpresi tutti i relativi controlli.
Per proprietà intento tutto quello che trovo nella toolbox proprità di visual studio.
Sapete se è possibile farlo? se si come?

Io ho già provato con questo codice:
XmlSerializer ser = new XmlSerializer(typeof(Combobox),"myCombo");
TextWriter writer = new StreamWriter(fileExport);
ser.Serialize(writer, cmbPipo);
writer.Close();

ma non mi va!
Help me!!!!

freeteo Profilo | Guru

Ciao,
il problema è che il controllo ComboBox non è marcato come serializzabile, quindi non sa come fare a salvare alcune sue proprietà
Però mi stavo chiedendo, tu hai bisogno di tutte le proprietà della Combo o solo di alcune?
Presumo tu voglia salvarle su un file per rileggerle, da codice.

Il fatto della serializzazione Xml presuppone che gli oggetti siano serializzabili in quel formato (tipicamente una serializzazione) e alcuni di questi che sono classi (come la proprietà Color) non riesce a serializzarli anche se lo facessi tu a mano proprietà per proprietà usando la reflection.

Se per te la serializzazione in Xml non è necessaria, ti ho scritto questa classe "miaCombo" che eredita da ComboBox in modo tu possa usarla nel tuo progetto, che fi fatto usa la reflection per le operazioni di salvare/recuperare da un file, le sue stesse impostazioni:
class MiaCombo :ComboBox { BinaryFormatter formatter = new BinaryFormatter(); public void SalvaProprieta(string file) { List<Proprieta> lista = new List<Proprieta>(); foreach (PropertyInfo prop in this.GetType().GetProperties()) { if (prop.PropertyType.IsSerializable) { object val = prop.GetValue(this, null); if (val != null) { Proprieta p = new Proprieta(); p.Nome = prop.Name; p.Valore = val; lista.Add(p); } } } //--- salvo sul file in binario using (Stream stream = File.OpenWrite(file)) { formatter.Serialize(stream,lista); } } public void CaricaProprieta(string file) { List<Proprieta> lista = new List<Proprieta>(); //--- leggo dal file in binario using (Stream stream = File.OpenRead(file)) { lista = formatter.Deserialize(stream) as List<Proprieta>; } foreach (Proprieta p in lista) { if (!string.IsNullOrEmpty(p.Nome)) { PropertyInfo prop = this.GetType().GetProperty(p.Nome); if(prop.CanWrite) prop.SetValue(this, p.Valore, null); } } } } [Serializable] public class Proprieta { public string Nome { get; set; } public object Valore { get; set; } }
mi sono appoggiato su una classe "Proprieta" mia perchè potrebbe tornarmi utile, ma è indifferente se vuoi farlo tu a mano.
Come noterai salvo solo alcune, quelle che sono "Serializzabili" (IsSerializable) e le appoggio su una lista per comodità mia, ma nonè necessaria come cosa, solo che se non hai grosse pretese, potrebbe andarti già bene come cosa.

Altrimenti se cambiare la combo è un problema, ti basta spostare i metodi su una classe esterna, passargli tramite parametro la combo, vedi tu come vai meglio...
ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5