在 C# 中保存和加载 DataGridView 内容和样式

Posted

技术标签:

【中文标题】在 C# 中保存和加载 DataGridView 内容和样式【英文标题】:Save and load DataGridView Content and Style in C# 【发布时间】:2015-02-03 17:00:30 【问题描述】:

我有一个包含许多列和行的 DataGridView,用户可以右键单击单元格并从 ContextMenuStrip 中选择一个选项。选项采用红色、蓝色、绿色等颜色,例如,如果用户选择红色,则所选单元格将其背景色设置为红色,并且用户还可以在该单元格中写入值。好吧,我的问题是,我找不到保存所有内容和样式的方法,所以如果用户重新打开 for,dataGridView 将有其最后的设置(包括单元格的 BackColor 和 ForeColor)。

我试过这个来保存内容,它给了我错误,我不知道如何打开它。

 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);
        
    

如果有更好的方法来保存内容和样式,也欢迎。 提前致谢

【问题讨论】:

可能有更好的方法,但您可以创建一个具有一些属性(值、背景色、前景色)的“单元格设置”类。然后使用对象序列化,您可以在表单关闭时将这些设置save 设置为 xml,并在表单构造函数中将这些设置read。 你能给我举个例子吗,只是单元格的背景色(保存颜色设置)? 您在寻找一个完整的工作示例吗?还是您发现Color 的序列化方式不同?前者比后者需要更多时间,这就是我问的原因。 只是我应该使用的循环,比如foreach(cell in dataGridView) .... 而且..如果有办法将dataGridView保存为Excel文件并包含每个单元格的背景色,那将是完美的。 【参考方案1】:

如果您只需要持久的单元格格式,那么以下类型的对象序列化将适合您。

创建一个类来序列化你想要的属性:

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; 

在您的主类中,从 xml 加载任何已保存的设置:

public List<SavedSettings> Settings  get; set; 

private void ReadXML()

  System.Xml.Serialization.XmlSerializer reader =
      new System.Xml.Serialization.XmlSerializer(typeof(List<SavedSettings>));

  if (File.Exists(@"SavedSettings.xml"))
  
    System.IO.StreamReader file = new System.IO.StreamReader(
      @"SavedSettings.xml");
    this.Settings = (List<SavedSettings>)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;
    
  

然后,当您准备好保存时,将单元格设置重新加载到对象数组中并序列化它:

private void SaveSettings()

  this.Settings = new List<SavedSettings>();

  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<SavedSettings>));

  System.IO.StreamWriter file = new System.IO.StreamWriter(@"SavedSettings.xml");
  writer.Serialize(file, this.Settings);
  file.Close();

注意这将允许某些属性保持不变。当然有更好的方法,我很乐意在时间允许的情况下学习它们,但是这个示例可以完成这项工作。至于额外的 Excel 要求,到目前为止我还没有尝试过。我会补充您的问题以反映吸引面向 Excel 的答案的要求。

【讨论】:

要加载我的设置,我可以在我的Form1_Load 中调用LoadDVG() 对吗? @ChrisCreateBoss 是的。在我的示例中,我在添加两个文本框列后在表单构造函数中完成了此操作,但理想情况下,您可以随时调用它。 它没有再次加载我的颜色,并且 xml 写入“正确”。这是应用程序在 xml 中写入的内容: -16777216-1 该节点被多次写入 是的!现在它完美运行,我使用 if 语句检查 xml 文件是否存在来预加载计划和天数值。非常感谢您的帮助@OhBeWise !!!

以上是关于在 C# 中保存和加载 DataGridView 内容和样式的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何通过textbox修改dataGridView中的值单击button并保存到数据库中

使用 c# 编辑 DataGridview 并将其保存在数据库表中

在c#中保存datagridview中的数据

c#中将datagridview中数据导出到excel中,点击保存可以保存,点击取消就出

C# 如何使datagridview中的单元格处于可编辑

如何实现c# winform DataGridView添加一行,添加数据后,保存到数据库?