9

我想在 a 的中心画一个实心小圆圈DataGridViewCell。矩形也可以解决问题。我想我必须在 CellPainting 事件中这样做。

我试过这个:

if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
        {                
            if (dgv_Cuotas.Columns[e.ColumnIndex].Name == "Seleccionar" && Convert.ToBoolean(dgv_Cuotas.Rows[e.RowIndex].Cells["pagada"].Value) == true)
            {
                e.CellStyle.BackColor = Color.LightGray; ;
                e.PaintBackground(e.ClipBounds, true);
                e.Handled = true;
            }
        }

在此处输入图像描述

它绘制了整个单元格,我只想要一个小圆圈或矩形,如下图所示:

在此处输入图像描述

我怎样才能做到这一点?使用 DataGridViewImageCell 不是一个选项,因为我遇到了格式错误。我只是可以将 DataGridViewCheckBoxCell 更改为 DataGridViewTextboxCell。

编辑: 我可以将其更改为 DataGridViewImageCell!不知道之前发生了什么,但我仍然无法在那里加载图像。我只是得到一个带有红十字的白色方块(没有图像图标)。这是我的代码:

dgv_Cuotas.Rows[row.Index].Cells["Seleccionar"] = new DataGridViewImageCell();
dgv_Cuotas.Rows[row.Index].Cells["Seleccionar"].Value = Properties.Resources.punto_verde;
dgv_Cuotas.Rows[row.Index].Cells["Seleccionar"].Style.ForeColor = Color.White;
dgv_Cuotas.Rows[row.Index].Cells["Seleccionar"].Style.SelectionForeColor = Color.White;
4

3 回答 3

7

感谢您的提问和回答@Andres。

请查看我的回复:(例如)我有一个包含 2 列的数据网格视图。在第一列中,我想在第 2 列中显示一个颜色圈,它的颜色是写(颜色名称)。为此,我的代码是:

for (int i = 1; i <= 5; i++)
    Dgv.Rows.Add();
Dgv[1, 0].Value = "Red";
Dgv[1, 1].Value = "Blue";
Dgv[1, 2].Value = "Yellow";
Dgv[1, 3].Value = "Green";
Dgv[1, 4].Value = "Black";

为了创建一个圆圈,我编写了这个类代码:

public static class GraphicsExtensions
{
    public static void FillCircle(this Graphics g, Brush brush, float centerX, float centerY, float radius)
    {
        g.FillEllipse(brush, centerX - radius, centerY - radius, radius + radius, radius + radius);
    }
}

在我的 datagridview 的 CellPainting 事件中,编写以下代码:

private void Dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex == 0 && e.RowIndex > -1)
    {
        Brush Brs= new SolidBrush(Color.FromName(Dgv[1, e.RowIndex].Value.ToString()));
        GraphicsExtensions.FillCircle(e.Graphics, Brs, e.CellBounds.Location.X + 5, e.CellBounds.Location.Y + 10, 5);
        e.Handled = true;                
    }
}

结果是具有 2 列的 datagridview:

第 1 列:6 个圆圈,6 种特定颜色

第 2 列:6 个颜色名称

谢谢。

于 2013-05-30T06:42:27.520 回答
5

我终于解决了。我在相同的位置绘制了一个与复选框大小相同的填充矩形。

我做了以下事情:

首先,我将 DataGridViewCheckBoxCell 更改为 DataGridViewTextBoxCell 以隐藏复选框。

DataGridViewTextBoxCell blank_cell = new DataGridViewTextBoxCell();
dgv_Cuotas.Rows[row.Index].Cells["Seleccionar"] = blank_cell;
dgv_Cuotas.Rows[row.Index].Cells["Seleccionar"].Style.ForeColor = Color.Transparent;
dgv_Cuotas.Rows[row.Index].Cells["Seleccionar"].Style.SelectionForeColor = Color.Transparent;

一定要选择透明的前景色,以免在单元格中看到“假”。

之后,我只是使用 cellpainting 事件在单元格中绘制矩形:

if (dgv_Cuotas.Columns[e.ColumnIndex].Name == "Seleccionar" && Convert.ToDecimal(dgv_Cuotas.Rows[e.RowIndex].Cells["Restante"].Value) == 0)
            {
                Color c1 = Color.FromArgb(255, 113, 255, 0);
                Color c2 = Color.FromArgb(255, 2, 143, 17);

                LinearGradientBrush br = new LinearGradientBrush(e.CellBounds, c1, c2, 90, true);
                ColorBlend cb = new ColorBlend();
                cb.Positions = new[] { 0, (float)1 };
                cb.Colors = new[] { c1, c2 };
                br.InterpolationColors = cb;

                Rectangle rect = new Rectangle(e.CellBounds.Location.X + 4, e.CellBounds.Location.Y + 4, 13, 13);

                e.Graphics.FillRectangle(br, rect);
                e.PaintContent(rect);
                e.Handled = true;
            }

您可以像我一样通过更改 Location.X 和 Location.Y 值来获得所需的位置。

在此处输入图像描述 希望对某人有所帮助!

于 2013-01-16T15:51:02.830 回答
1

查看 DataGridView 模板以便以这种方式自定义列。这会给你更大的控制权。

这可能会有所帮助: http ://csharp.net-informations.com/datagridview/csharp-datagridview-template.htm

于 2013-01-16T01:26:06.990 回答