gpt4 book ai didi

c# - DataGridView自定义单元格绘制的文字溢出

转载 作者:行者123 更新时间:2023-11-30 16:40:24 25 4
gpt4 key购买 nike

这是我的细胞绘画方法。

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 中的第一个单元格是部分可见的,那么文本将呈现在行标题中。同样,对于行中的最后一个单元格,文本从中流出。任何建议/解决方案表示赞赏。

最佳答案

CellPainting 事件可让您绘制到 DataGridView整个可见区域,包括所有标题,仅不包括滚动条。

它确实为您提供了 e.CellBounds 矩形中的 Cell 区域,但它仍然允许您在其外部进行绘制。

要将绘图限制在 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);

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

注意事项:

  • 您还可以为 DrawText 设置目标矩形和 DrawString , 但使用不同的字体绘图会使这变得有点困难。
  • 由于某些原因,剪切区域似乎不适用于 TextRenderer

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

关于c# - DataGridView自定义单元格绘制的文字溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51441885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com