如何绘制自定义DataGridViewCell

时间:2009-05-14 23:12:31

标签: c# winforms

我正在尝试在DataGridView中手动绘制单元格。具体来说,我想绘制一行CheckBoxes。通常你可以添加一个DataGridViewCheckBoxColumn,但据我所知,没有DataGridViewCheckBoxRow。 (我不能只创建大量的DGVCheckBoxColumns,因为我想在不同的行中使用不同的单元格类型。)

我已经覆盖了DGV的OnCellPainting()方法。 我创建了一个DGVCheckBoxCell:

protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
{
   DataGridViewCheckBoxCell cbcell = new DataGridViewCheckBoxCell();
}

我不知道下一步该做什么。


更多信息:

我最终试图转置数据网格视图。所以我可能有一个CheckBoxColumn,一个ComboBoxColumn,一个TextBoxColumn和任何其他类型的列,然后将它们变成行。我不认为我可以制作DGVRows,所以我认为我将不得不处理单个细胞。

感谢目前为止的所有答案......

3 个答案:

答案 0 :(得分:4)

我唯一能想到的就是自己绘制复选框,这可以完成但是是PIA。因为一旦你这样做,你就必须控制所有用于悬停/检查/取消选中等的绘画......但是,这里有一些代码可以帮助你入门:

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    e.Paint(e.ClipBounds, DataGridViewPaintParts.All);
    if (e.RowIndex == 2) //I chose a random number, but this is the row you want with checkboxes
    {
        var rect = this.dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
        //The CheckBoxState enum has all different values for different "visual states"
        CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(rect.X, rect.Y), System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal);
        e.Handled = true;
    }
}
祝你好运!!

答案 1 :(得分:1)

据我所见,您有两种选择:

  1. 创建一个从DataGridViewCell派生的特殊Cell类型,其行为取决于该单元格的内容。然后,您可以将该Cell类型设置为每列的CellTemplate,DataGridView将自动构造要使用的实例。痛苦,但相对容易理解而且不太难做 - 只是单调乏味。

  2. 与#1相同,但不是制作古怪的Cell类型,而是创建一个特殊的CellTemplate并覆盖其Clone方法。让克隆方法自动确定要构造的正确类型的单元格并返回该单元格,而不是返回模板的原始克隆。这是一个可怕的黑客攻击,除非你无法获得第一种工作方法,否则我不推荐它。

  3. 成功使用第二种方法需要了解当前正在构造的行(如果您在Reflector中查看DataGridViewRow.CreateCells,您可以了解它是如何工作的)。知道要构建哪种类型将需要了解当前行,并且我不是100%肯定你可以得到它。但我怀疑如果你愿意试一试并挖掘它是可能的。

答案 2 :(得分:0)

此处有人问同样的问题:vbforums.com

  

“您需要创建新的DataGridViewTextBoxCell对象并将它们分配给行的Cells集合的项目。”

我还没想出怎么做。
this post中,作者写道它是可能的。

您的方案是否数据绑定?