将新的空白行添加到datagridview c#

时间:2016-02-23 12:55:23

标签: c# winforms datagridview insert

我的DataGridView DataTableDataSource。现在我想在DataGridView中插入一个新的空行并使其完全变黑(如分隔线)。我试图复制一行并将其设为黑色:

Datagridview1.rows.insertcopies(2,2,1);

但是我收到了这个错误:

  当控件受数据绑定时,

行无法以编程方式添加到datagridview的rows集合中。

如何保持DataGridView的方式并插入空行?

澄清

我想做一个分隔符。我找不到任何解决方案,所以我想做一个空行并使其变黑。使用:

for(int i=0;i<datagridview1.Rows.Count-1;i++)
{
    if(datagridview1.Rows[i].Cells[1].formattedvalue.ToString() != datagridview1.Rows[i+1].Cells[1].formattedvalue.ToString())
    {
        //here I need to make a divider.
    }
}

3 个答案:

答案 0 :(得分:3)

虽然你可以添加一个空白行作为分隔符,但这似乎更像是对我的黑客攻击。相反,我会为现有的单元格边框着色。

这实际上比我预期的要多 - 我认为这就像在行分隔符上设置颜色一样简单,但显然that's not how it works

但你仍然可以通过处理来自己绘画:

this.dataGridView1.CellPainting += DataGridView1_CellPainting;

同样,由于您对分隔符的绘制取决于单元格值,因此您需要处理:

this.dataGridView1.CellValueChanged += DataGridView1_CellValueChanged;

我们的想法是检查您的条件(将所需列中的单元格值与同一列中的下一个单元格值进行比较),并在需要时为需要分隔符的行中的每个单元格绘制分隔符。当条件列中的单元格值更改时,其整行应该无效,以触发该行中的每个单元格进行重新绘制。同样,前一个应该无效,以防它绘制分频器的条件现在也已经改变。

private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.RowIndex >= 0 && e.RowIndex != this.dataGridView1.Rows.Count - 1)
    {
        DataGridViewRow thisRow = this.dataGridView1.Rows[e.RowIndex];
        DataGridViewRow nextRow = this.dataGridView1.Rows[e.RowIndex + 1];

        if (thisRow.Cells[1].FormattedValue.ToString() != nextRow.Cells[1].FormattedValue.ToString())
        {
            e.Paint(e.ClipBounds, DataGridViewPaintParts.All);

            Rectangle divider = new Rectangle(e.CellBounds.X, e.CellBounds.Y + e.CellBounds.Height - 2, e.CellBounds.Width, 2);
            e.Graphics.FillRectangle(Brushes.Black, divider);

            e.Handled = true;
        }
    }
}

private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 1)
    {
        if (e.RowIndex > 0)
        {
            this.dataGridView1.InvalidateRow(e.RowIndex - 1);
        }

        this.dataGridView1.InvalidateRow(e.RowIndex);
    }
}

demonatration of dividers between rows

相反,您也可以使用RowPrePaint代替CellPainting来执行此操作,但最终会遇到以下可能性:

another demonstration

答案 1 :(得分:0)

这个错误几乎是自我解释的,我可以想到一个可以给你最终结果的解决方法,但是它真的很“丑陋”并且可能会破坏未来操作中的数据,所以我不确定我会推荐它

DataRow empty = table.NewRow();
table.Rows.Add(empty);

答案 2 :(得分:0)

您可以在DataTable中添加新行并再次绑定它! 像

这样的东西
        DataRow rd = ds.Tables[0].NewRow();

        ds.Tables[0].Rows.Add(rd);

        GridView1.DataSource = ds;
        GridView1.DataBind();