C# 重置列增量datagridview
删除一行或多行后,我正在尝试更新我的C# 重置列增量datagridview,c#,winforms,datagridview,C#,Winforms,Datagridview,删除一行或多行后,我正在尝试更新我的WinForms应用程序中DataGridView中的行增量编号。关于如何在DataTable中向列添加增量,我已经查看了源代码和要点。我的DataGridView绑定到我的DataTable,而DataTable绑定到一个数据集 我是如何通过datatable创建的: DataColumn itemNumber = new DataColumn(); itemNumber.ColumnName = "ItemNumber"; itemNumber.AutoI
WinForms
应用程序中DataGridView
中的行增量编号。关于如何在DataTable
中向列添加增量,我已经查看了源代码和要点。我的DataGridView绑定到我的DataTable,而DataTable绑定到一个数据集
我是如何通过datatable创建的:
DataColumn itemNumber = new DataColumn();
itemNumber.ColumnName = "ItemNumber";
itemNumber.AutoIncrement = true;
itemNumber.AutoIncrementSeed = 1;
itemNumber.AutoIncrementStep = 1;
DataColumn article = new DataColumn();
article.ColumnName = "Article";
article.ReadOnly = true;
DataColumn description = new DataColumn();
description.ColumnName = "Description";
description.ReadOnly = true;
DataColumn type = new DataColumn();
type.ColumnName = "Type";
type.ReadOnly = true;
//add to datatable
dt.Columns.Add(itemNumber);
dt.Columns.Add(article);
dt.Columns.Add(description);
dt.Columns.Add(type);
从DataGridView中删除一行
foreach (DataGridViewRow row in dgvView.SelectedRows)
{
dgvView.Rows.RemoveAt(row.Index);
}
如果我有5行,删除一行。我希望增量值从1,2,3,4等开始
有人能告诉我如何做到这一点吗?我想不出一个有效的方法来做到这一点,但这里有一些可能适用于小数据集的想法 自己跟上这些价值观 1) 不要将列定义为自动增量列): 2) 处理
DataGridView.RowsAdded
和DataGridView.RowsRemoved
事件并“重置”值:
private void dgvView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
if (dgvView.Columns.Contains("ItemNumber"))
{
foreach (DataGridViewRow r in dgvView.Rows)
{
r.Cells["ItemNumber"].Value = r.Index + 1;
}
}
}
private void dgvView_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
if (dgvView.Columns.Contains("ItemNumber"))
{
foreach (DataGridViewRow r in dgvView.Rows)
{
r.Cells["ItemNumber"].Value = r.Index + 1;
}
}
}
通过重建
数据表
并重新绑定到该表来重新生成值
1) 在下面定义帮助器方法:
private DataTable ResetAutoIncrementColumn(DataTable dt, string autoIncrementColumnName)
{
DataTable result = new DataTable();
DataColumn itemNumber = new DataColumn(autoIncrementColumnName);
itemNumber.AutoIncrement = true;
itemNumber.AutoIncrementSeed = 1;
itemNumber.AutoIncrementStep = 1;
result.Columns.Add(itemNumber);
dt.Columns.Remove(autoIncrementColumnName);
result.Merge(dt, true);
return result;
}
2) 在适当的时间调用它(例如,在原始问题中的一系列删除之后):
如果您只是在寻找一个可视的行号 此外,如果您只是希望在
DataGridView
上有一个可视的行号(并且您不关心底层DataTable
中存在的值),您可以按如下方式处理DataGridView.rowpostaint
事件(从中提取):
谢谢,我可以看出这不是一个有效的方法。仅仅设置重置增量值似乎需要做很多工作。但是我认为你是对的,对于这项工作,递增应该通过添加每一行来处理。我将向此添加rowsAdded和rowsRemoved处理程序。
private DataTable ResetAutoIncrementColumn(DataTable dt, string autoIncrementColumnName)
{
DataTable result = new DataTable();
DataColumn itemNumber = new DataColumn(autoIncrementColumnName);
itemNumber.AutoIncrement = true;
itemNumber.AutoIncrementSeed = 1;
itemNumber.AutoIncrementStep = 1;
result.Columns.Add(itemNumber);
dt.Columns.Remove(autoIncrementColumnName);
result.Merge(dt, true);
return result;
}
dt = ResetAutoIncrementColumn(dt, "ItemNumber");
dt.Columns["ItemNumber"].SetOrdinal(0);
dgvView.DataSource = dt;
dgvView.Columns["ItemNumber"].DisplayIndex = 0;
private void dgGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
var grid = sender as DataGridView;
var rowIdx = (e.RowIndex + 1).ToString();
var centerFormat = new StringFormat()
{
// right alignment might actually make more sense for numbers
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}