自动调整使用自定义绘图的DataGridViewComboBoxCell

时间:2016-06-08 18:38:08

标签: c# winforms datagridview autosize datagridviewcomboboxcell

我的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的正确编辑来自动调整我填充的列时,会发生以下情况:

Autosize

如何调整行为以便在自动调整时考虑到组合下拉列表?

感谢。

1 个答案:

答案 0 :(得分:2)

当您双击列标题分隔符以使列自动调整大小时,它会使列宽等于最宽的单元格。使用以下公式计算自动大小模式下组合框单元格的宽度:

  • 格式化值的宽度
  • 组合框按钮的宽度
  • 单元格样式填充
  • 错误图标宽度
  • 文本和按钮和图标周围的一些额外填充

快速修复

在您的情况下,这些彩色矩形占据空间,但在计算单元格的自动大小时,不会计算它们周围的宽度和空间。

作为一个简单的解决方案,您可以向列中添加一些填充。您可以在设计器中执行此操作,方法是编辑列并在列DefaultCellStyle中设置填充。还可以使用代码编写代码:

column.DefaultCellStyle.Padding = new Padding(16,0,16,0);

长期解决方案

如果列是可重用的列类型,我建议您创建自定义列类型。然后,您可以封装绘制逻辑并计算自定义单元格中的大小和其他一些功能。如果您决定创建自定义单元格,您会发现这些与此问题相关的方法很有用: