我正在尝试创建一个自定义的DataGridViewRow,它将充当分隔符(将数据分成组)。我是通过覆盖DataGridViewRow类中的PainCells方法实现的,如下所示:
protected override void PaintCells(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, int rowIndex, DataGridViewElementStates rowState, bool isFirstDisplayedRow, bool isLastVisibleRow, DataGridViewPaintParts paintParts)
{
graphics.FillRectangle(new SolidBrush(BackgroundColor),rowBounds);
StringFormat format = new StringFormat {Alignment = StringAlignment.Center,LineAlignment = StringAlignment.Center};
graphics.DrawString(Text, this.DataGridView.Font, new SolidBrush(ForeColor), rowBounds,format);
}其中Text、BackgroundColor和ForeColor是我的SeparatorDataGridViewRow类的属性。这些行看起来完全像我想要的那样。但这只是“封面”,因为在绘制的矩形下面仍然有原始的数据网格单元格。特别是我添加的带有删除按钮表单DataGridViewButtonColumn的单元格。正因为如此,如果我点击按钮所在的单元格,我的分隔行就会被删除。
我不认为这是实现我想要实现的东西的正确方法,所以如果你们能告诉我正确的方向,或者告诉我可以用这个解决方案做什么,以阻止用户使用这一行做任何事情,无论“在绘制的矩形下面”是什么,我都会很高兴。
我几乎没有创建自定义控件的经验,所以我真的不知道要覆盖什么方法,或者添加什么来实现某些目标。感谢您的每一次帮助:)
发布于 2011-07-22 05:13:28
好了,我部分解决了我的问题。我不知道这个解决方案是否好,它带来了另一个问题,这对我来说是一个谜。
在我的SeparatorDataGridViewRow上,我将标签设置为“分隔符”。然后,我创建了自己的DataGridView控件,在其中覆盖了OnUserDeletingRow方法:
protected override void OnUserDeletingRow(DataGridViewRowCancelEventArgs e)
{
if (e.Row.Tag != null && e.Row.Tag.ToString().Equals("Separator"))
{
e.Cancel = true;
return;
}
base.OnUserDeletingRow(e);
}这样,我的Separator行就不会被用户删除。但是现在奇怪的事情发生了。我有一个这样的DataGridView:

当我选择名称为"2“的行并将其删除时,一切正常:

它适用于所有行。但是,如果我选择任何分隔符行并按Delete,它不会被删除,但如果我删除它上面的任何行,就会发生这种情况:

在本例中,我选择了Separator 2,然后删除了名为"2“的行。这很奇怪,因为实际的行正在被删除,而所选行实际上是Separator2行。这是某种油漆问题。但是我不知道为什么只有当我之前“尝试”删除Separator行时才会发生这种情况。在删除上述任何内容之前,当我尝试删除Separator行时,绘制过程中发生了什么变化?
https://stackoverflow.com/questions/6752522
复制相似问题