我的DataGridView
上有一个DataGridViewComboBoxColumn
。这是我的自定义单元格绘制处理程序:
private void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.ColumnIndex == 1 && e.RowIndex >= 0)
{
e.PaintBackground(e.CellBounds, true);
//e.PaintContent(e.CellBounds);
Graphics g = e.Graphics;
Color c = Color.Empty;
string s = "";
Brush br = SystemBrushes.WindowText;
Brush brBack;
Rectangle rDraw;
rDraw = e.CellBounds;
rDraw = Rectangle.FromLTRB(e.CellBounds.Left, e.CellBounds.Top, e.CellBounds.Right, e.CellBounds.Bottom - 1);
brBack = Brushes.White;
Pen penGridlines = new Pen(dataGridView.GridColor);
g.DrawRectangle(penGridlines, rDraw);
g.FillRectangle(brBack, rDraw);
penGridlines.Dispose();
if (dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null)
{
ComboboxColourItem oColourItem = (ComboboxColourItem)dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
s = oColourItem.ToString();
c = oColourItem.Value;
}
int butSize = e.CellBounds.Height;
Rectangle rbut = new Rectangle(e.CellBounds.Right - butSize,
e.CellBounds.Top, butSize, butSize);
ComboBoxRenderer.DrawDropDownButton(e.Graphics, rbut,
System.Windows.Forms.VisualStyles.ComboBoxState.Normal);
if (c != Color.Empty)
{
SolidBrush b = new SolidBrush(c);
Rectangle r = new Rectangle(e.CellBounds.Left + 6,
e.CellBounds.Top + 5, 10, 10);
g.FillRectangle(b, r);
g.DrawRectangle(Pens.Black, r);
g.DrawString(s, Form.DefaultFont, Brushes.Black,
e.CellBounds.Left + 25, e.CellBounds.Top + 3);
b.Dispose();
}
e.Handled = true;
}
}
当我通过双击DVG的正确编辑来自动调整我填充的列时,会发生以下情况:
如何调整行为以便在自动调整时考虑到组合下拉列表?
感谢。
答案 0 :(得分:2)
当您双击列标题分隔符以使列自动调整大小时,它会使列宽等于最宽的单元格。使用以下公式计算自动大小模式下组合框单元格的宽度:
快速修复
在您的情况下,这些彩色矩形占据空间,但在计算单元格的自动大小时,不会计算它们周围的宽度和空间。
作为一个简单的解决方案,您可以向列中添加一些填充。您可以在设计器中执行此操作,方法是编辑列并在列DefaultCellStyle
中设置填充。还可以使用代码编写代码:
column.DefaultCellStyle.Padding = new Padding(16,0,16,0);
长期解决方案
如果列是可重用的列类型,我建议您创建自定义列类型。然后,您可以封装绘制逻辑并计算自定义单元格中的大小和其他一些功能。如果您决定创建自定义单元格,您会发现这些与此问题相关的方法很有用: