有没有办法强制DataGridView为所有单元格激活其CellFormatting事件?

haw*_*bsl 12 datagridview winforms cell-formatting

我们使用CellFormatting事件在我们的应用程序中为各种网格中的单元格着色.

我们有一些通用的代码可以处理导出到Excel(和打印),但它在Black&White中执行.现在我们想要更改它并从网格中获取颜色.

这个问题和答案有助于(并且有效)......除了大网格的问题超出了单个屏幕.网格中尚未显示的部分(逻辑上)从未获取其CellFormatting代码,因此它们的基础颜色永远不会被设置.其结果是,在Excel中的颜色编码fizzles了一半下来的页面.

似乎有三种解决方案:

1)告诉用户在导出到Excel之前必须滚动到网格的所有部分.哈!不是一个严肃的解决方

2)在执行导出到Excel之前,以编程方式滚动到网格的所有部分.只比(1)少可怕

3)在我们的导出到Excel代码中,在顶部触发一些东西,告诉DataGridView绘制/格式化整个区域,例如

  MyDataGridView.FormatAllCells()
Run Code Online (Sandbox Code Playgroud)

有没有像这样的东西?

哦,还有第四个选项,但这将涉及触及大量现有代码:

4)停止使用CellFormatting事件,在加载时格式化单元格.问题是我们必须在我们的应用程序中重新设置每个网格,因为CellFormatting是我们自年点以来完成它的方式.

Rex*_*der 6

我有一个可能的解决方案 - 在导出函数中访问每个单元格的Cell.FormattedValue属性.根据微软的说法,这会迫使CellFormatting事件发生.


Spe*_*uce 6

正如其他答案中所述,访问DataGridViewCell.FormattedValue确实是强制CellFormatting为特定单元格(重新)调用事件的一种简单方法。但是,在我的情况下,此属性也会导致涉及自动调整列大小的不良副作用。虽然寻找了很长时间一个可行的解决方案,我终于遇到了以下魔术方法的工作完美:DataGridView.Invalidate()DataGridView.InvalidateColumn()DataGridView.InvalidateRow(),和DataGridView.InvalidateCell()

这 4 种方法强制CellFormatting仅针对指定范围(单元格、列、行或整个表)重新调用事件,并且不会导致任何令人讨厌的自动调整大小工件。


haw*_*bsl 3

假设,正如 @DavidHall 所建议的那样,没有什么神奇的,.FormatAllCells我们唯一的选择就是停止使用 CellFormatting。

\n\n

然而,这里的新问题是在加载期间应用单元格样式格式似乎没有任何效果。如果你用谷歌搜索一下,就会有很多帖子。他们还指出,如果您将相同的代码放在表单上的按钮下并在加载后单击它(而不是在加载中,代码将起作用......因此在应用样式之前网格必须可见)。关于该主题的大多数建议建议您使用...鼓声...单元格格式。啊啊!

\n\n

最终找到了一个建议使用DataBindingComplete网格事件的帖子。这有效。

\n\n

不可否认,这个解决方案是我不需要的选项“4”的变体。

\n