2

我正在寻找一种简单的方法来确定 WinForms DataGridViewCell.Value 在其单元格中是否完全可见。

如果列太窄,则只有部分值可见,我需要在代码中检测这种情况。

到目前为止,我认为我可以将内容的宽度(使用 Graphics.MeasureString)与单元格的宽度进行比较,但这似乎有点笨拙。

如果可能的话,寻找更优雅的东西。

谢谢

4

2 回答 2

0

通过查看 DataGridViewCell的源代码,.NET 团队似乎决定使用TextRenderer MeasureText 函数而不是 Graphics MeasureString 函数(参见第 2924 行)。这并不完全是您要寻找的东西,但看起来它比必须检索 Graphics 对象要少一些笨重。

除此之外,我不相信有办法确定 Text 单元格是否截断了一个值。这可能与性能有关。DataGrid 不会为每个单元格存储一个单独的单元格对象……这对于大型数据集来说太占用内存了。相反,它根据需要存储样式信息(通常用于整个列,尽管您可以根据需要覆盖特定单元格的样式数据)和单元格值(在一个巨大的对象数组中)。在渲染单元格时,它会为列中的每个单元格重用相同的单元格对象(使用不同的 cellBounds 和值等反复调用 Paint)。只有在渲染过程中它才会知道内容是否太长,但它几乎会立即丢弃这些信息(没有地方存储它,渲染后也不需要它)。

我想 .NET 团队本可以为您创建一个函数来完成所有测量等,但话又说回来,有很多特性可以实现。这个不是。

于 2013-05-15T17:58:19.310 回答
0

只是一个想法..

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
于 2013-05-15T16:30:56.500 回答