DataGridView 的自定义单元格绘制的文本溢出

2023-12-07

这是我的细胞绘画方法。

DataGridView grid = (DataGridView)sender;

if ( e.RowIndex == -1 || e.ColumnIndex == -1 )
{ return; }
if ( ( grid.Rows [ e.RowIndex ].Cells [ e.ColumnIndex ].Value == null ) )
    return;

Brush gridBrush = new SolidBrush(GridList[0].GridColor),backColorBrush = new SolidBrush(e.CellStyle.BackColor);
Pen gridLinePen = new Pen(gridBrush);

// Erase the cell.
e.Graphics.FillRectangle ( backColorBrush, e.CellBounds );

// Draw the grid lines (only the right and bottom lines;
// DataGridView takes care of the others).
e.Graphics.DrawLine ( gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1 );
e.Graphics.DrawLine ( gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom );

// Draw the text content of the cell, ignoring alignment.
if ( e.Value != null )
{
    Brush brush = new SolidBrush(Color.Red);
    Brush brush1 = new SolidBrush(Color.Black);
    String s = (String)e.Value;

    System.Drawing.Rectangle rect = e.CellBounds;
    List<int> pos = null;
    if ( grid.Rows [ e.RowIndex ].Cells [ e.ColumnIndex ].Tag != null )
    {
        pos = ( List<int> ) grid.Rows [ e.RowIndex ].Cells [ e.ColumnIndex ].Tag;
    }

    String[] arr = s.Split('\n');
    SizeF stringSize = TextRenderer.MeasureText(e.Graphics, arr[0], e.CellStyle.Font, e.CellBounds.Size);

    float wid = stringSize.Height;
    int X,Y;

    for ( int i = 0; i < arr.Length; i++ )
    {
        if ( pos == null || pos.IndexOf ( i ) == -1 )
        {
            X = ( e.CellBounds.X );
            Y = ( e.CellBounds.Y + i * ( ( int ) stringSize.Height ) );
            TextRenderer.DrawText ( e.Graphics, arr [ i ], e.CellStyle.Font, new Point ( X, Y ), SystemColors.ControlText );
            //e.Graphics.DrawString(arr[i], e.CellStyle.Font, brush1, new PointF(X, Y), StringFormat.GenericDefault);
        }
        else
        {
            X = ( e.CellBounds.X );
            Y = ( e.CellBounds.Y + i * ( int ) stringSize.Height );
            Brush brushForBox = new SolidBrush(Color.FromArgb(100, 120, 50,0));
            e.Graphics.FillRectangle ( brushForBox, X, Y, e.CellBounds.Width, ( int ) stringSize.Height );
            TextRenderer.DrawText ( e.Graphics, arr [ i ], e.CellStyle.Font, new Point ( X, Y ), SystemColors.ControlText );
            //e.Graphics.DrawString(arr[i], e.CellStyle.Font, brush, new PointF(X, Y), StringFormat.GenericDefault);
        }
    }
}
//grid.InvalidateCell(-1, e.RowIndex);
e.Handled = true;

现在它工作正常,但第一个和最后一个单元格的文本溢出。例如,如果第一个单元格中dataGridView部分可见,然后文本将呈现在行标题中。同样,对于行中的最后一个单元格,文本从其中流出。任何建议/解决方案表示赞赏。


The CellPainting事件将让你画到整个可见区域 of the DataGridView,包括所有标题并仅排除滚动条。

它确实为您提供了Cell的面积在e.CellBounds矩形,但它仍然可以让你在它的外面绘制。

将您的绘图限制为Cell最简单的方法是改变e.Graphics.ClipBounds到单元格的边界矩形;为了确保不会发生溢出到行标题的情况,我们将其限制为仅从行标题的左侧开始,可能如下所示:

int rhw = grid.RowHeadersWidth;
Rectangle clip = e.CellBounds;
if (e.CellBounds.X < rhw)
    clip = new Rectangle(rhw, clip.Y, clip.Width - rhw, clip.Height);
e.Graphics.SetClip(clip, CombineMode.Replace);

现在你绘制的任何东西都不会溢出。

Notes:

  • 您还可以为两者设置目标矩形DrawText and 拉绳,但是用不同的字体绘制会让这变得有点困难。
  • 由于某种原因,剪切区域似乎不适用于TextRenderer.

另请注意:我无法重现下溢到标题中的效果。我可以想象,如果顶部电池不太完全可见,它可能来自位于负极的电池顶部罐。 (不过,我的 DGV 只允许我滚动整行。)要排除这些情况,您可能需要计算一个更好的剪切矩形,该矩形仅从标题单元格正下方开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataGridView 的自定义单元格绘制的文本溢出 的相关文章

随机推荐

  • 在 Inno Setup 中从 Internet 安装文件

    我正在使用 Inno Setup 来分发我的应用程序 是否可以检查 Inno Script 的特定条件 并根据需要从互联网下载并安装一些文件 创新设置6 1较新的版本具有内置的下载支持 不再需要第三方解决方案 检查Examples Code
  • Google Chrome 扩展程序登录功能

    我正在开发一个 Chrome 扩展程序 我正在努力实现这一目标 单击 chrome 扩展程序图标 您会看到一个简单的登录页面 输入您的凭据 我需要将它们发送到 REST API 该 API 具有一个登录方法 该方法将返回我需要的 API 密
  • 将 Excel 工作簿另存为 HTML - 无法访问“System.IO.MemoryStream”

    我有一些代码想要将 Excel 电子表格转换为html所以我可以用它作为电子邮件的正文 Excel Application excel new Excel Application Excel Workbook workbook excel
  • 如何更改 .NET 应用程序的预定义 userconfig 目录?

    目前我的应用程序的用户设置存储在这个默认目录中 C Users User Name AppData Roaming Company Name Assembly Name vshos Url Hash Assembly Version 我知道
  • 是否有任何营销 API webhooks 用于修改广告系列/广告集/广告

    在我编写的程序中 用户可以暂停 取消暂停活动 我想知道如果用户通过 Facebook 广告管理器修改营销活动 我是否可以更新营销活动的状态 我能找到的唯一网络钩子是领先一代 看来我发现了隐藏的文档here 你必须将 ads rules en
  • 部署后对参数的更改未显示在报表服务器上

    我的 SSRS 2008 报告中有 7 个参数 3 个字符串多重选择 1 个日期时间 3 个字符串值 并且我已在默认值 它在我的 Visual Studio 2008 预览窗口中工作正常 但是部署后到我的报告服务器 未选中参数的 NULL
  • 仅打印 Python 中特定键的字典术语的值

    我想知道如果我有一本字典并且我想只打印出特定键的值 我会在Python 中做什么 它将位于变量中以及 dict Lemonade 1 45 87 Coke 23 9 23 Water 98 2 127 inp input Select ke
  • 是否可以从模拟器内访问照片的地理标记元数据?

    我编写了一个应用程序来检索照片的 GPS 元数据 它可以在我的 iPhone 上运行 但不能在模拟器中运行 如果我将包含地理标签的照片拖到模拟器上 它就会被放入照片库中 然后 我的应用程序发出以下代码 ALAssetRepresentati
  • nginx 位置通过文件扩展名语法拒绝

    我编写了两种不同的设置 一种用于拒绝对点文件的访问 另一种用于拒绝对文件扩展名列表的访问 但是 是否有任何语法可以拒绝其他文件扩展名列表中的点文件 location 7z bak bash bz2 config dist engine fl
  • 使用应用程序脚本拆分(分解)谷歌电子表格中的合并表格单元格

    当操作 复制 移动 包含合并单元格的范围时 我总是收到错误 您的粘贴与合并单元格重叠 请取消合并单元格并重试 但是当尝试使用以下命令取消合并范围内的单元格时Range breakApart 我收到另一个错误 所选单元格无法合并 这更令人困惑
  • 优雅的 Haskell 案例/错误处理

    我试图更好地理解如何处理 haskell 中的错误情况 并编写了一些代码来帮助我解决这个问题 是否有更好的方法 更优雅 更短 更通用 来处理多个替代方案 例如嵌套的 case 表达式 关于该主题有什么好的教程吗 本例的虚构类型 这有点简化
  • Python:将 Unicode-Hex-String 转换为 Unicode

    我有一个由带有该函数的 unicode 字符串制成的十六进制字符串 def toHex s res for c in s res 02X ord c at least 2 hex digits can be more return res
  • 推动 JavaScript 性能的限制是什么?

    在过去的几个月里 我一直在构建一个原型页面 该页面使用了大量 SVG 并且通常包含很多元素 JavaScript 和服务器端 大量 AJAX 也正在处理大量数据 页面上有数千个事件侦听器 重点是 它相当重 在 JS 中执行此类操作的最大障碍
  • Android 应用程序的 Facebook 登录(使用释放密钥)

    我正在尝试在 Google Play 上发布我的应用程序 我的应用程序中有 Facebook 登录信息 直到昨天 一切都工作正常 直到我运行应用程序时debug keystore 但是 当我使用自己的发布密钥并签署我的应用程序时 Faceb
  • 如何在Electron框架中使用html模板?

    我需要构建一个具有多个窗口的跨平台应用程序 所以我想知道如何在Electron中使用html模板 基于类似的问题据我所知 Electron 中没有内置的 html 模板语言 这实际上很棒 因为它允许您使用任何其他模板语言 我目前正在玩ejs
  • 使用远程计算机通过 JupyterLab 打开网站(类似于代理)

    我通过连接SSH到正在运行的远程计算机JupyterLab 当我在中运行以下代码时JupyterLab我看到我的本地计算机的 IP 地址 from IPython display import IFrame IFrame src https
  • 如何在 Android 中的列表视图中显示 Dropbox 文件?

    我已经在这里浏览答案有一段时间了 并在我的代码中使用了大部分答案 但它似乎仍然不起作用 我只想显示 Dropbox 帐户中内容的列表视图 并为用户提供下载文件 文件夹的选项 我的 MainActivity 过去常常在打开后立即崩溃 用处理
  • 如何使用 CURL 请求构建、准备和设置 JWT 授权承载令牌

    为了发送和接收授权持有人 我确实阅读了此内容使用 cURL 设置 Bearer 令牌的正确方法和这个如何正确使用 Bearer 代币 这是我的代码 url http www example com phpinfo php data arra
  • 从不可变类型继承[重复]

    这个问题在这里已经有答案了 我想知道继承是如何运作的int list string和其他不可变类型 基本上我只是继承一个这样的类 class MyInt int def init self value 我似乎无法弄清楚 如何设置像它所设置的
  • DataGridView 的自定义单元格绘制的文本溢出

    这是我的细胞绘画方法 DataGridView grid DataGridView sender if e RowIndex 1 e ColumnIndex 1 return if grid Rows e RowIndex Cells e