C# 重写DataGridViewRow.OnRowPrePaint时e.PaintCells()未绘制单元格时出错

C# 重写DataGridViewRow.OnRowPrePaint时e.PaintCells()未绘制单元格时出错,c#,winforms,datagridview,C#,Winforms,Datagridview,我试图通过重写OnRowPrePaint方法,完全控制派生DataGridView中DataGridViewRows的绘制。为了测试该方法,我尝试使用EventArgs绘制方法绘制所有单元格内容和背景,例如e.PaintCells()或e.PaintCellsBackground(),然后设置EventArgs.Handled=true,以防止任何其他绘制方法触发 到目前为止,我的代码是: protected override void OnRowPrePaint(DataGridVie

我试图通过重写
OnRowPrePaint
方法,完全控制派生DataGridView中DataGridViewRows的绘制。为了测试该方法,我尝试使用
EventArgs
绘制方法绘制所有单元格内容和背景,例如
e.PaintCells()
e.PaintCellsBackground()
,然后设置
EventArgs.Handled=true
,以防止任何其他绘制方法触发

到目前为止,我的代码是:

    protected override void OnRowPrePaint(DataGridViewRowPrePaintEventArgs e)
    {
        using (SolidBrush brush = new SolidBrush(Color.Blue))
        {
            e.Graphics.FillRectangle(brush, e.RowBounds);
        }            

        e.PaintCellsBackground(e.RowBounds, true);
        e.PaintCells(e.RowBounds, e.PaintParts);

        e.Handled = true;
    }
我原以为这会将行涂成蓝色,然后使用
e.PaintCellsBackground()
e.PaintCells()
方法在蓝色背景上绘制单元格,但我看到的只是蓝色行,没有其他颜色。MSDN关于
PaintCellsBackground
的文章的备注如下

当您自己绘制DataGridViewRow及其单元格内容时,请使用PaintCellsBackground方法。如果手动绘制整行及其单元格的内容,请将HandledEventArgs.Handled属性设置为true。如果HandledEventArgs.Handled为true,则不会发生CellPaint和RowPostPaint事件


这让我相信我应该能够做到我所希望的?

谢谢你的反馈,我找不到这篇文章,但我读到你可以在
oncellpraining
OnRowPostPaint
中设置
e.handled=true
,并在
OnRowPrePaint
中处理所有绘画,但我不明白这意味着绘画的全部

当您调用
OnRowPrePaint
中的任何绘制方法时,也会调用
oncellpaining
并显示为处理实际绘制,正如我在代码中禁用的那样,希望使用
e.PaintCells()
方法进行绘制

示例1

class MyDataGridView : DataGridView
{
    protected override void OnRowPrePaint(DataGridViewRowPrePaintEventArgs e)
    {
        e.PaintCells(e.RowBounds, e.PaintParts);
        e.PaintHeader(true);
        e.Handled = true;
    }
    protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
    {
        base.OnCellPainting(e);
    }
}
在本例中,
OnRowPrePaint
绘制单元格和标题,
oncellpaining
激发以进行绘制,
DataGridView
按预期绘制

示例2

class MyDataGridView : DataGridView
{
    protected override void OnRowPrePaint(DataGridViewRowPrePaintEventArgs e)
    {
        e.PaintCells(e.RowBounds, e.PaintParts);
        e.PaintHeader(true);
        e.Handled = true;
    }
    protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
    {
        e.Handled = true;
    }
}
在本例中,
OnRowPrePaint
尝试绘制单元格和标题,但当触发
OnCellPainting
时,Handled设置为true,且未绘制任何内容,导致出现空白的
DataGridView

示例3

class MyDataGridView : DataGridView
{
    protected override void OnRowPrePaint(DataGridViewRowPrePaintEventArgs e)
    {
        e.Handled = true;
    }
    protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
    {
        base.OnCellPainting(e);
    }
}
在最后一个示例中,
OnRowPrePaint
在不调用任何绘制方法的情况下进行处理,并且从不激发
OnCellPaint
来绘制任何行内容,只绘制列标题,而不绘制其他内容


关键是理解如何将
OnRowPrePaint
oncellpraining
OnRowPostPaint
结合在一起。

我用row.Cells[n].Style.BackColor和row.DefaultCellStyle.BackColor对单元格着色做了很多工作。。我不清楚你在问什么。请改写问题,并说明问题所在以及预期结果。如果代码中有问题,也可以分享更有效的代码。谢谢你的反馈@reza我更新了我的问题我测试了代码,它还绘制了单元格。可能问题是我们无法使用此代码复制的其他内容。我创建了一个包含代码的
MyDataGridView
,并将一个
DataTable
设置为网格的
DataSource
。结果并不漂亮,但细胞被画出来了。这是我测试的结果。关键是理解OnRowPrePaint、OnCellPaint和OnRowPostPaint是如何结合在一起的。这就是为什么您应该发布更有效的代码,因为问题是我们无法使用此代码复制的其他内容。。当你问问题时,提问是非常重要的:)@RezaAghaei谢谢你的链接,这篇文章真的很有用。直到我开始把问题分解成一种像样的方式(我应该先这样做),我才开始思考这个问题!我需要学会后退一步,不要一直直着身子跳水