自定义DataGridViewRow问题

时间:2011-07-19 18:55:13

标签: c# .net winforms datagridview

我正在尝试创建一个自定义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类的属性。行看起来就像我想要的那样。但这只是“封面”,因为在绘制的矩形下面仍然有原始的datagrid单元格。特别是带有删除按钮的单元格形成了我添加的DataGridViewButtonColumn。因此,如果我单击按钮为单位的单元格,我的分隔符行将被删除。

我不认为这是实现我想要实现的目标的正确方法,所以如果你们能够向我展示正确的方向或告诉我用这个解决方案做什么来阻止用户做任何事情的话,我会很高兴无论什么是“在绘制的直肠下方”,这一行都有。

我几乎没有创建自定义控件的经验,所以我真的不知道要覆盖什么方法或添加什么来实现某些目标。 每一个帮助表示赞赏:)

1 个答案:

答案 0 :(得分:0)

好的,我部分地解决了我的问题。我不知道这个解决方案是否合适,它带来了另一个问题,这对我来说是一个谜。

在我的SeparatorDataGridViewRow上,我将Tag设置为"分隔符"。然后我创建了自己的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);
    }

这样我的分隔符行不能被用户删除。但现在发生了奇怪的事情。我有一个像这样的DataGridView:

enter image description here

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

enter image description here

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

enter image description here

在这种情况下,我选择了分隔符2,然后删除了名为" 2"的行。它很奇怪,因为实际的行被删除,所选的行实际上是Separator2行。这是某种Paint问题。但我不知道为什么只有在我尝试"删除之前的分隔符行。当我在删除上述任何内容之前尝试删除Separator行时,绘画过程中有什么变化?