Enregistrer et charger le contenu et le style DataGridView en C #

J’ai un DataGridView avec beaucoup de colonnes et de lignes, l’utilisateur peut faire un clic droit dans une cellule et sélectionner une option d’un ContextMenuSsortingp. Les options sont en couleurs comme le rouge, le bleu, le vert, etc., si l’utilisateur sélectionne, par exemple, le rouge, la cellule sélectionnée définit sa couleur de fond sur rouge et l’utilisateur peut également écrire une valeur dans cette cellule. Eh bien, mon problème est que, je ne trouve pas un moyen de sauvegarder tout le contenu et le style, donc si l’utilisateur rouvre le pour, le dataGridView aura ses derniers parameters (y compris les BackColor et ForeColor des cellules).

J’ai essayé ceci pour enregistrer le contenu, cela m’a donné une erreur et je ne sais pas comment l’ouvrir.

private void button4_Click(object sender, EventArgs e) { SaveFileDialog svd = new SaveFileDialog(); svd.Filter = "XML Files (*.xml)|*.xml"; if(svd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { DataTable dt = ((DataView)this.dataGridView1.DataSource).Table; dt.WriteXml(svd.FileName); } } 

S’il existe un meilleur moyen de sauvegarder le contenu et le style, nous le souhaitons également. Merci d’avance

Si vous souhaitez un formatage de cellule persistant, le type de sérialisation d’object suivant fonctionnera pour vous.

Créez une classe pour sérialiser vos propriétés souhaitées:

 public class SavedSettings { [XmlIgnore] public Color ForeColor { get; set; } [XmlElement("ForeColor")] public int ForeColorARGB { get { return this.ForeColor.ToArgb(); } set { this.ForeColor = Color.FromArgb(value); } } [XmlIgnore] public Color BackColor { get; set; } [XmlElement("BackColor")] public int BackColorARGB { get { return this.BackColor.ToArgb(); } set { this.BackColor = Color.FromArgb(value); } } public object Value { get; set; } } 

Dans votre classe principale, chargez tous les parameters enregistrés à partir de xml:

 public List Settings { get; set; } private void ReadXML() { System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(List)); if (File.Exists(@"SavedSettings.xml")) { System.IO.StreamReader file = new System.IO.StreamReader( @"SavedSettings.xml"); this.Settings = (List)reader.Deserialize(file); file.Close(); } } private void LoadDGV() { this.ReadXML(); if (this.Settings != null) { // This assumes your dgv has added columns already. int rows = this.Settings.Count / this.dataGridView1.Columns.Count; int cols = this.dataGridView1.Columns.Count; this.dataGridView1.Rows.AddCopies(0, rows); for (int i = 0; i < this.Settings.Count; i++) { int row = i / cols; int col = i % cols; this.dataGridView1[col, row].Style.BackColor = this.Settings[i].BackColor; this.dataGridView1[col, row].Style.ForeColor = this.Settings[i].ForeColor; this.dataGridView1[col, row].Value = this.Settings[i].Value; } } } 

Ensuite, lorsque vous êtes prêt à enregistrer, rechargez vos parameters de cellule dans le tableau d'objects et sérialisez-le:

 private void SaveSettings() { this.Settings = new List(); foreach (DataGridViewRow row in this.dataGridView1.Rows) { if (!row.IsNewRow) { foreach (DataGridViewCell cell in row.Cells) { SavedSettings setting = new SavedSettings(); setting.BackColor = cell.Style.BackColor.ToArgb() == 0 ? Color.White : cell.Style.BackColor; setting.ForeColor = cell.Style.ForeColor.ToArgb() == 0 ? Color.Black : cell.Style.ForeColor; ; setting.Value = cell.Value; this.Settings.Add(setting); } } } this.WriteXML(); } private void WriteXML() { System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(List)); System.IO.StreamWriter file = new System.IO.StreamWriter(@"SavedSettings.xml"); writer.Serialize(file, this.Settings); file.Close(); } 

Remarque Cela permettra à certaines propriétés de persister. Il existe sûrement de meilleures méthodes et j'aimerais beaucoup les apprendre si le temps le permet, mais cet exemple peut faire l'affaire. En ce qui concerne l'exigence supplémentaire relative à Excel, je ne l'ai pas encore essayée. Je voudrais compléter votre question pour refléter cette nécessité d'attirer des réponses axées sur Excel.