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

2024-01-10

我有一个包含许多列和行的 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);
        }
    }

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


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

创建一个类来序列化您所需的属性:

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

Note这将允许某些属性持续存在。当然有更好的方法,我很想在时间允许的情况下学习它们,但是这个例子can做这份工作。至于额外的 Excel 要求,我到目前为止还没有尝试过。我将补充您的问题以反映吸引面向 Excel 的答案的要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中保存和加载 DataGridView 内容和样式 的相关文章

随机推荐

  • 无法使用ofstream将汉字写入文本文件

    我在用着std wofstream在文本文件中写入字符 我的字符可以包含来自不同语言 英语到中文 的字符 我想打印我的vector
  • 如何在 UIPickerView 中添加部分标题?

    这绝不是一个需要的事情 如果可以的话那就太好了 我不确定这是否可以做到 我有一个UIPickerView它将有 41 42 个选项 现在我按字母顺序列出了所有选项 我希望将它们分成几组 并且在每组之前我希望它有一个标题 与 TableVie
  • 如何手动将文档添加到 Firestore 数据库中的集合?

    I have a quite simple database in Firestore geographic name lat and Lon The database is very static and I only need to a
  • 传单多色折线

    Leaflet 中是否有一个选项可以制作一条具有不同路径颜色的折线 在谷歌中 您可以使用具有颜色属性的路径对象 但是我在传单中没有找到类似的选项 有一些图书馆像https github com Oliv leaflet polycolor
  • 如何检查列表列表的元素是否匹配条件?

    我有一个列表列表 pairs lt list list Name A Value 11 list Name B Value 17 list Name C Value 23 我该如何检查pairs列表包含一个名称 A 的元素 我也想得到这个元
  • Node.js:如何在查询聚合中返回对象?

    我需要使用以下方法计算集合中指定字段的总和group by 所以 我使用了聚合函数 我的愿望是函数应该只返回对象 当我使用aggregate 它返回Array of Objects 但我的查询是返回对象数组 不是单个对象 例如 到目前为止我
  • 设置目录可见性隐藏 woo-commerce

    如何以编程方式设置隐藏在 woo commerce WordPress 中的目录可见性 就像这里提到的 https docs woothemes com document catalog visibility options https d
  • 来自不同控件的 WPF 触发器

    我正在尝试根据包含的文本框的焦点属性更改包含边框的背景颜色 有人可以解释我的代码有什么问题吗
  • 为什么 Python 中 `object() > 0` 为 True?

    In 32 object gt 0 Out 32 True 事实上 它比我尝试过的任何整数都大 因为 Python 2 x 试图在不同类型的对象之间进行可用的比较 即使它们没有意义 它已在 Python 3 上修复 gt gt gt obj
  • 基于 Boost.ASIO 的 HTTP 客户端库(如 libcurl)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个现代的 C HTTP 库 因为 libcurl 的缺点很难通过 C 包装器来解决 基于
  • 在SoapUI免费版中创建脚本库

    我是 SoapUI 和 groovy 脚本编写的新手 我想创建一个 groovy 脚本存储库 可以在各种测试步骤中重用 我正在使用 SoapUI 免费版本 以下是我的 SoapUI 项目的结构 Project TestSuite TestC
  • 如何从 3 维 sympy 表达式获得快速 lambda 函数?

    我正在使用 sympy 为 cfd 模拟生成不同的表达式 大多数这些表达式都是 exp f x y z 类型 例如 f x y z sin x cos y sin z 为了获取网格上的值 我使用 simpy lambdify 例如 impo
  • 在芹菜中的多个队列中确定队列的优先级?

    我们使用 celery 来执行异步后台任务 并且有 2 个队列用于不同优先级的任务 我们有 2 个节点集群分别为它们提供服务 事情进展顺利 正如预期的那样 问题 我们得到的大多是低优先级的任务 为了优化资源利用率 我想知道是否有一种方法可以
  • 绘制速度不够快,无法跟上 TouchMoved 的速度?

    我正在尝试在我的 iPhone 应用程序中实现简单的绘画功能 我尝试用位图画笔更新位图 我也尝试过本教程 http www ipodtouchfans com forums showthread php t 132024 尽管代码几乎完全不
  • 如何获取具有指定名称的 DataMemberAttribute 的属性?

    如何反射性地获取具有给定名称的 DataMember 的属性 假设每个 DataMember 都有一个唯一的名称 例如 在以下代码中 名称为 p1 的 DataMember 的属性为PropertyOne DataContract Name
  • 如何计算 R 中的文本行数?

    我想使用 R 它是议会演讲记录的笔录 计算文本中不同演讲者所说的行数 基本文本如下所示 MR JOHN This activity has been going on in Tororo and I took it up with the
  • 用户 Fragment.setRetainInstance 不处理重新创建是一个好习惯吗?

    这是一个很好的做法吗Fragment setRetainInstance 为了你所有的Fragments为了摆脱处理Fragment游戏 保存实例状态等 为什么不 是的 如果片段必须保留配置更改 您可以将其与不在返回堆栈中的片段一起使用 它
  • CSS - 禁用宽度:自动

    我有一个尺寸为 32 x 32 的图像 即宽度和高度属性 但是 图像的大小仍保持默认值 150 x 150 看看CSS我可以看到有一个width auto在父 CSS 文件中 当我关闭此功能时 图像大小会调整为 32 x 32 我想在不更改
  • 如何将wxi文件包含到wxs中?

    继很好的建议 https stackoverflow com questions 471424 wix tricks and best practices我已将一些变量移至WXI file 我如何将其包含在WXS file 使用 预处理器标
  • 在 C# 中保存和加载 DataGridView 内容和样式

    我有一个包含许多列和行的 DataGridView 用户可以右键单击单元格并从 ContextMenuStrip 中选择一个选项 选项有红色 蓝色 绿色等颜色 如果用户选择红色 则所选单元格将其背景颜色设置为红色 并且用户还可以在该单元格中