【发布时间】:2021-07-15 20:08:51
【问题描述】:
我在我的项目中使用 AdvancedDataGridView。我可以使用右键菜单更改我想要的单元格(和文本)颜色,但是当我使用列过滤器时,所有这些颜色信息都会丢失。即使我删除了过滤器,这些颜色信息也不会回到原来的位置。 我设计了一个类,用于在打开/退出应用程序时保存/加载 DGV 颜色信息:
public static void WriteDataGridViewSettings(System.Windows.Forms.DataGridView dgv)
{
XmlTextWriter writer = new XmlTextWriter(Application.StartupPath + @"\MyGridColor.xml", null);
writer.WriteStartDocument();
writer.WriteStartElement(dgv.Name);
int LastRow = dgv.Rows.Count;
for (int i = 0; i < LastRow; i++)
{
writer.WriteStartElement("Row");
writer.WriteStartElement("CellColor");
writer.WriteString(dgv.Rows[i].DefaultCellStyle.BackColor.ToArgb().ToString());
writer.WriteEndElement();
writer.WriteStartElement("TextColor");
writer.WriteString(dgv.Rows[i].DefaultCellStyle.ForeColor.ToArgb().ToString());
writer.WriteEndElement();
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
}
public static void ReadDataGridViewSettings(System.Windows.Forms.DataGridView dgv)
{
XmlDocument xmldoc = new XmlDocument();
XmlNodeList xmlnode;
FileStream fs = new FileStream(Application.StartupPath + @"\MyGridColor.xml", FileMode.Open, FileAccess.Read);
xmldoc.Load(fs);
xmlnode = xmldoc.GetElementsByTagName("Row");
for (int i = 0; i <= xmlnode.Count-1; i++)
{
int cellcolor = int.Parse(xmlnode[i].ChildNodes.Item(0).InnerText.Trim());
int textcolor = int.Parse(xmlnode[i].ChildNodes.Item(1).InnerText.Trim());
if (cellcolor != 0)
{
dgv.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(Convert.ToInt32(cellcolor));
dgv.Rows[i].DefaultCellStyle.ForeColor = Color.FromArgb(Convert.ToInt32(textcolor));
}
else
{
dgv.Rows[i].DefaultCellStyle.BackColor = Color.White;
dgv.Rows[i].DefaultCellStyle.ForeColor = Color.Black;
}
}
fs.Close();
}
由于上面提到的问题,我在使用滤镜退出应用后不小心丢失了颜色信息。
【问题讨论】:
-
您使用的
AdvancedDataGridView是什么? -
我已经从包管理器下载了它。 DG.AdvancedDataGridView
-
可能发生的事情是过滤器在过滤
BindingSource时重绘所有行。我建议您根据为行着色的标准,在AdvancedDataGridView.RowPrePaint事件中为行着色。您如何确定哪些行需要着色?我似乎只是根据它们写入文件的位置进行着色,当您开始通过过滤更改行的位置时,这显然会中断。 -
没有为行着色的特定标准。我刚刚设计了一个右键菜单,并用它来改变我想要的行的颜色。我认为我的加载/保存颜色代码没有问题。我只需要做一些事情来避免重绘所有行。你能用代码给出你的解决方案,以便我更好地理解吗?
-
我建议您向
DataGridView添加一个隐藏列,该列在您填充数据时为每一行分配一个唯一索引。然后,您可以存储应该着色的索引列表,并根据索引是否在列表中进行着色在RowPrePaint。
标签: c# datagridview colors