我正在寻找一种简单的方法来确定 WinForms DataGridViewCell.Value 在其单元格中是否完全可见。
如果列太窄,则只有部分值可见,我需要在代码中检测这种情况。
到目前为止,我认为我可以将内容的宽度(使用 Graphics.MeasureString)与单元格的宽度进行比较,但这似乎有点笨拙。
如果可能的话,寻找更优雅的东西。
谢谢
我正在寻找一种简单的方法来确定 WinForms DataGridViewCell.Value 在其单元格中是否完全可见。
如果列太窄,则只有部分值可见,我需要在代码中检测这种情况。
到目前为止,我认为我可以将内容的宽度(使用 Graphics.MeasureString)与单元格的宽度进行比较,但这似乎有点笨拙。
如果可能的话,寻找更优雅的东西。
谢谢
通过查看 DataGridViewCell的源代码,.NET 团队似乎决定使用TextRenderer MeasureText 函数而不是 Graphics MeasureString 函数(参见第 2924 行)。这并不完全是您要寻找的东西,但看起来它比必须检索 Graphics 对象要少一些笨重。
除此之外,我不相信有办法确定 Text 单元格是否截断了一个值。这可能与性能有关。DataGrid 不会为每个单元格存储一个单独的单元格对象……这对于大型数据集来说太占用内存了。相反,它根据需要存储样式信息(通常用于整个列,尽管您可以根据需要覆盖特定单元格的样式数据)和单元格值(在一个巨大的对象数组中)。在渲染单元格时,它会为列中的每个单元格重用相同的单元格对象(使用不同的 cellBounds 和值等反复调用 Paint)。只有在渲染过程中它才会知道内容是否太长,但它几乎会立即丢弃这些信息(没有地方存储它,渲染后也不需要它)。
我想 .NET 团队本可以为您创建一个函数来完成所有测量等,但话又说回来,有很多特性可以实现。这个不是。
只是一个想法..
Function IsFit() as Boolean
Dim szDummy As New SizeF
dim picDummy as New Picturebox '--> or refer to your picbox
gDummy = Me.picDummy.CreateGraphics
szDummy = gDummy.MeasureString(column value , New Font(FontName, _
FontSize, FontStyle, graphicUnitPixel))
if szDummy.Width >= MyDataGrid.Columns(column name).Width then return True
End Function