2

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

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

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

但结果不行。请帮我建立这个号码。

更新:结果:

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

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

4

4 回答 4

2

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

一个更好的地方是在DataBindingCompleteDefaultValuesNeeded事件中。

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

数据绑定完成:

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

需要的默认值:

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

这个要求似乎有点不寻常——你没有解释为什么需要这个数字,但你可能想看看将行添加到你的基础数据集中(例如,很容易用 DataTable 做)或者把它放到Subek 建议的行标题。


最后要注意的一件事 - 这种自动生成的列通常最好在CellValidating事件中完成,例如,当你和你对其他两列求和的列时。这在这里行不通,因为您的专栏不是基于其他专栏,但值得一提的是作为一般方式。

于 2012-07-15T12:48:48.983 回答
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();
        }
    }
于 2012-07-15T09:56:10.323 回答
0

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

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

在此处输入图像描述

于 2016-02-29T06:13:02.523 回答
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;
}

在此处输入图像描述

我一开始就尝试过RowsAdded事件,但是对于新添加的行它不能正常工作。

于 2018-04-17T01:33:31.983 回答