在 C# 中保存和加载 DataGridView 内容和样式
Save and load DataGridView Content and Style in C#
我有一个包含许多列和行的 DataGridView,用户可以右键单击一个单元格,然后 select 来自 ContextMenuStrip 的一个选项。选项有红色、蓝色、绿色等颜色,如果用户 selects,例如红色,selected 单元格将其背景颜色设置为红色,用户也可以在该单元格中写入一个值。好吧,我的问题是,我找不到保存所有内容和样式的方法,因此如果用户重新打开 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);
}
}
如果有更好的保存内容和样式的方法,也欢迎。
提前致谢
如果持久单元格格式是您想要的,那么以下类型的对象序列化将适合您。
创建一个 class 以序列化您想要的属性:
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; }
}
在您的主 class 中,从 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导向答案的要求。
我有一个包含许多列和行的 DataGridView,用户可以右键单击一个单元格,然后 select 来自 ContextMenuStrip 的一个选项。选项有红色、蓝色、绿色等颜色,如果用户 selects,例如红色,selected 单元格将其背景颜色设置为红色,用户也可以在该单元格中写入一个值。好吧,我的问题是,我找不到保存所有内容和样式的方法,因此如果用户重新打开 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);
}
}
如果有更好的保存内容和样式的方法,也欢迎。 提前致谢
如果持久单元格格式是您想要的,那么以下类型的对象序列化将适合您。
创建一个 class 以序列化您想要的属性:
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; }
}
在您的主 class 中,从 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导向答案的要求。