更改'DataGridView'在虚拟模式下
本文关键字:模式 虚拟 DataGridView 更改 | 更新日期: 2023-09-27 17:53:33
我只是学习如何在虚拟模式下使用DataGridView
控件。我使用一个列表数组来存储一个文本文件的内容,这个文件可能很小,也可能很大。DataGridView
中的一个特定列需要根据该单元格中的文本内容更改单元格的背景颜色。因此,我有一个事件处理程序:
private void datagridview_CellValueNeeded(
object sender, DataGridViewCellValueEventArgs e)
填充DataGridView
的每一行。我的问题是,我不知道在哪里插入代码来设置背景颜色,因为单元格是在每行中创建的(现在在虚拟模式下)。
我尝试使用CellValueNeeded
的事件处理程序首先检查特定的列ID,然后设置单元格背景颜色如下:
datagridview[e.ColumnIndex, e.RowIndex].Style.SelectionBackColor =
component_color;
,其中component_color
是预先确定的。然而,这种方法并没有改变颜色。我还尝试处理其他事件,如CellEnter
, CellLeave
, CellValueChanged
, RowsAdded
和RowLeave
。然而,我从调试工作中了解到,这些事件要么永远不会触发,要么在CellValueNeeded
事件之前触发。
那么,是否有可能通过处理CellValueNeeded
事件来设置在特定列中创建的单元格的背景颜色?或者我应该通过处理不同的事件来完成这个任务?
您需要处理DataGridView.CellFormatting
事件。例如:
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == 3 && e.Value == targetValue)
e.CellStyle.BackColor = Color.Red;
else
e.CellStyle.BackColor = SystemColors.Window;
}
欢呼
尽管Luc答案在形式上是正确的,并且在所有情况下都可以工作,但值得注意的是,在CellStyle属性上分配单个属性将克隆()完整的原始继承样式。
微软和层次结构建议的最佳实践详细解释清楚地说明(并解释为什么)DataGridViewCellStyle应该尽可能重用。
技巧在于,由于CellStyle包含继承的样式,您不能直接更改它,因此必须在访问它之前克隆它。如果你有1000个单元格匹配"目标",那么你克隆1000次相同的继承样式,只是为了应用1000次相同的样式(红色)。因此,最佳实践是:将列默认设置为该列的预期默认样式,然后创建一次"highlight"单元格样式,并在可能的情况下重用它。
在几乎所有的情况下,不会注意到差异,也不会注意到任何类型的损失(内存,cpu,闪烁等)。然而,我认为重要的是要明白,在引擎盖下有很多东西正在发生。此外,CellFormatting经常被调用,所以为了避免副作用,保持底层操作非常快速是非常重要的。
上面的答案也可以重写为:
private static DataGridViewCellStyle m_targetValueCellStyle = new DataGridViewCellStyle{ BackColor = Color.Red};
// Somewhere (i.e. in the constructor after InitializeComponents() ) set:
// dataGridView1.Columns[3].DefaultCellStyle = new DataGridViewCellStyle{ BackColor = SystemColors.Window};
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == 3 && e.Value == targetValue)
e.CellStyle = m_targetValueCellStyle;
}
这种方法在非常复杂的场景中可能非常有限,因为你需要事先知道所有的样式和组合(例如,红色背景色,白色前色,还有红色背景色,黑色前色和粗体),这可能是棘手和麻烦的。我觉得微软的建议还是值得一提的。这不是纯粹的性能问题,更重要的是知道你在做什么,发生了什么,以便选择最佳策略(最佳策略取决于场景)。我认为我们需要教年轻的程序员在开发时做出明智的选择。
请认为我的回答不是替代的,而是对卢克的回答的补充。