我正在开发一个包含DataGridView的Windows窗体应用程序.此DataGridView有3列,所有列都只是文本单元格:时间戳连接消息我遇到的问题是,当我添加一行(以编程方式)时,我发现如果文本太长,文本就会消失.具体来说,如...
我正在开发一个包含DataGridView的Windows窗体应用程序.此DataGridView有3列,所有列都只是文本单元格:
>时间戳
>连接
>消息
我遇到的问题是,当我添加一行(以编程方式)时,我发现如果文本太长,文本就会消失.具体来说,如果文本长度超过4563个字符,则文本消失.
我知道DataGridViewTextBoxColumn类有一个属性调用MaxInputLength,可以限制输入的字符数.但根据Documentation,它只会影响用户手动输入的文本.但是,我正在以编程方式输入此文本.
但是为了确保,我将此属性设置得非常高,但是当我通过4563字符限制时,仍会出现消失的文本问题.
我注意到的一件事是文本仍然存在(即底部的滚动条仍然可以滚动,就好像文本仍在那里)但我看不到文本本身.我也可以编辑文本.
我可以添加字符直到4563限制,但是一旦我通过它,文本就会消失.如果我按退格键返回到4563个字符,则会再次出现该文本.
我正在使用.NET 4.0进行开发,因为我必须支持Windows XP.
解决方法:
这是一个简短的答案,可能会令你失望:这是一个报告的错误并经过微软验证,关闭为“不够重要,无法修复”.可能会有更多的实例,但至少从2011年7月开始就知道了.“解决方法”只是限制单元格宽度的大小,但对于你来说可能并不令人满意.
然而,好奇心得到了我的好处,所以我开始深入研究它;这是第一个值得一提的观察:
如果你看一系列的图片,你会发现我用默认的字体大小/样式和特定的数字5460复制了你的问题.5460有什么特别之处?好吧,没有什么特别的,除了当你的角色阈值越过它时,列的ContentBounds和Width传递32767. 32767有什么特别之处?除了作为DataGridViewTextBoxCell的默认MaxInputLength之外,它还是有符号short或Int16(2 ^ 15-1)的上限.我非常怀疑这里发生的问题是巧合,尽管这与MaxInputLength本身无关.我愿意打赌你首先注意到4563个字符的问题,因为你的字体大小也将宽度扩展到32767.
接下来的问题是为什么?我不太确定.我开始关注兔子洞并拆解一些.NET 4.0 DataGridView *库以找出答案.这是一个非常庞大而复杂的控制,我无法得出任何明确的结论,但我发现值得注意的一件事是列可以假设的绝对最大宽度为65536,即UN64的Int16的值(2 ^ 16):
在添加或调整列的大小时,您会在很多私有内部位置看到此检查,我对其进行了测试.尺寸不会变大
具有讽刺意味的是有两个原因.例如,使用默认设置,尽管编辑输入长度为32767个字符,并且在编程上是任意的,但您只能在列中显示10922个字符(每个字符65536/6像素).
其次,为什么这个问题会在最大列宽最大值的最大值处开始出现? Hmmmm.这完全是一个猜测,但我认为沿着这条线的某个地方,无论是什么渲染文本被设置为常规短而不是无符号短…或者沿着这些线的某些东西的最大值.我怀疑DataGridViewTextBoxCell()的实现中的PaintPrivate()方法,所以如果你感觉很活泼,可能会把显微镜放在上面.你需要一个IL反汇编程序才能看到这些没有公开曝光的内容.具体来说,这部分代码我怀疑:
if (text != null && (paint && !flag2 || computeContentBounds))
{
int y = cellStyle.WrapMode == DataGridViewTriState.True ? 1 : 2;
rectangle3.Offset(0, y);
// ISSUE: explicit reference operation
// ISSUE: variable of a reference type
Rectangle& local = @rectangle3;
// ISSUE: explicit reference operation
int width = (^local).Width;
// ISSUE: explicit reference operation
(^local).Width = width;
rectangle3.Height -= y + 1;
if (rectangle3.Width > 0 && rectangle3.Height > 0)
{
TextFormatFlags cellStyleAlignment = DataGridViewUtilities.ComputeTextFormatFlagsForCellStyleAlignment(this.DataGridView.RightToLeftInternal, cellStyle.Alignment, cellStyle.WrapMode);
if (paint)
{
if (DataGridViewCell.PaintContentForeground(paintParts))
{
if ((cellStyleAlignment & TextFormatFlags.SingleLine) != TextFormatFlags.Default)
cellStyleAlignment |= TextFormatFlags.EndEllipsis;
TextRenderer.DrawText((IDeviceContext) graphics, text, cellStyle.Font, rectangle3, flag3 ? cellStyle.SelectionForeColor : cellStyle.ForeColor, cellStyleAlignment);
}
}
else
rectangle1 = DataGridViewUtilities.GetTextBounds(rectangle3, text, cellStyleAlignment, cellStyle);
}
对不起,这本书!
TL;如果您想将字符包含在巨大的细胞中,请使用小屁股.
本文标题为:c# – .NET Windows窗体DataGridView以编程方式添加时,单元格文本消失
基础教程推荐
- C# 调用WebService的方法 2023-03-09
- C# List实现行转列的通用方案 2022-11-02
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- 一个读写csv文件的C#类 2022-11-06
- C#类和结构详解 2023-05-30
- C# windows语音识别与朗读实例 2023-04-27
- ZooKeeper的安装及部署教程 2023-01-22
- unity实现动态排行榜 2023-04-27
- C#控制台实现飞行棋小游戏 2023-04-22
- winform把Office转成PDF文件 2023-06-14