【发布时间】:2018-07-23 17:32:55
【问题描述】:
这是我的细胞画法
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 中的第一个单元格部分可见,则文本将呈现在行标题中。同样,对于行中的最后一个单元格,文本会从其中流出。任何建议/解决方案表示赞赏。
【问题讨论】:
-
尝试使用 DrawString 的重载或推荐的 (!) DrawText 与目标矩形。当然,如果文本不适合矩形,现在将被截断..
-
@TaW 我已经尝试过 DrawString 但对于多行文本不能正常工作。我没有明白你的意思“带有目标矩形的DrawText”你能解释一下吗?只是为了让你知道我写这篇文章是为了突出显示 datagridview 单元格中的某一行文本。
-
@ArunPratap 您提到的问题是在两个单元格之间绘制更粗的线,这与我的问题相去甚远。就我而言,我有一个文本溢出问题。您至少应该先完成这两个问题。
标签: c# visual-studio winforms