我有一个DataGridView并将其绑定到数据库。
我在DataGridView中使用以下代码自动创建行号:
dgv.Rows[e.RowIndex].Cells[0].Value = e.RowIndex +1;
但结果不合适。请帮我建一个这个号码。
更新: 结果:
1 ssss mmmm
2 tttt tttt
rrrrr rrrr
tttttt tttt
....
所以最后两行没有显示数字。
答案 0 :(得分:2)
RowsAdded
事件对此不起作用 - 尝试向事件处理程序添加一些调试输出,您将看到事件是针对行集而不是单行触发的,这就是为什么你只得到填写的前两个值。
更好的地方是DataBindingComplete
和DefaultValuesNeeded
事件。
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;
}
我在第一次尝试了RowsAdded
事件,但是对于新添加的行,它无效。
答案 3 :(得分:-1)