Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重置列增量datagridview_C#_Winforms_Datagridview - Fatal编程技术网

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);
}