在DataGridView中自动构建数字

时间:2012-07-15 06:25:13

标签: c# winforms datagridview

我有一个DataGridView并将其绑定到数据库。

我在DataGridView中使用以下代码自动创建行号:

dgv.Rows[e.RowIndex].Cells[0].Value = e.RowIndex +1;

但结果不合适。请帮我建一个这个号码。

更新: 结果:

1      ssss      mmmm
2      tttt      tttt
       rrrrr     rrrr
       tttttt    tttt
....

所以最后两行没有显示数字。

4 个答案:

答案 0 :(得分:2)

RowsAdded事件对此不起作用 - 尝试向事件处理程序添加一些调试输出,您将看到事件是针对行集而不是单行触发的,这就是为什么你只得到填写的前两个值。

更好的地方是DataBindingCompleteDefaultValuesNeeded事件。

DataBindingComplete会在第一次加载时填写所有值,然后DefaultValuesNeeded将填写每一个新行。

DataBindingComplete:

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow r in dataGridView1.Rows)
    {
        r.Cells["AutoGenColumn"].Value = r.Index + 1;
    }
}

DefaultValuesNeeded:

void dataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
    dataGridView1.Rows[e.Row.Index].Cells["AutoGenColumn"].Value = e.Row.Index + 1;
}

这个要求似乎有点不寻常 - 您没有解释为什么需要这个数字,但您可能希望将该行添加到基础数据集中(例如,很容易使用DataTable)或者放置这是Subek建议的行标题。


最后要注意的一点是 - 这种自动生成的列通常最好在CellValidating事件中完成,例如,当您和一列与其他两列相加时。这不起作用,因为您的专栏不是基于其他专栏,但值得一提的是作为一般方法。

答案 1 :(得分:0)

您可以在标题单元格中显示..

DataGridView gridView = sender as DataGridView;

    if (null != gridView)
    {
        foreach (DataGridViewRow r in gridView.Rows)
        {
            gridView.Rows[r.Index].HeaderCell.Value = (r.Index + 1).ToString();
        }
    }

答案 2 :(得分:0)

这样可行。

public Form1()
{
    ... ...
    gridView.RowStateChanged += GridView_RowStateChanged;
}

private void GridView_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
    (sender as DataGridView).Rows[e.Row.Index].Cells[0].Value = e.Row.Index + 1;
}

enter image description here

我在第一次尝试了RowsAdded事件,但是对于新添加的行,它无效。

答案 3 :(得分:-1)

我相信这是最简单的,对我来说是100%

<asp:TemplateField HeaderText="Sl. No.">
   <ItemTemplate>
       <%# Container.DataItemIndex + 1 %>
   </ItemTemplate>
</asp:TemplateField>

enter image description here