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谢谢你的链接,这篇文章真的很有用。直到我开始把问题分解成一种像样的方式(我应该先这样做),我才开始思考这个问题!我需要学会后退一步,不要一直直着身子跳水