【问题标题】:Reset column increment datagridview重置列增量datagridview
【发布时间】:2014-12-27 21:20:41
【问题描述】:

在删除一行或多行后,我试图在我的WinForms 应用程序中更新DataGridView 中的行增量号。我已经查看了有关如何将增量添加到DataTable 中的列的来源和所有要点。我的 DataGridView 绑定到我的 DataTable,并且绑定到 DataSet。

我是如何通过数据表创建的:

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 等开始...

有人可以告诉我如何实现这一目标吗?

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    我想不出一种有效的方法来做到这一点,但这里有一些想法可能适用于小型数据集。

    自己跟上价值观

    1) 不要将该列定义为 AutoIncrement 列):

    DataColumn itemNumber = new DataColumn();
    itemNumber.ColumnName = "ItemNumber";
    //itemNumber.AutoIncrement = true;
    //itemNumber.AutoIncrementSeed = 1;
    //itemNumber.AutoIncrementStep = 1;
    

    2) 处理 DataGridView.RowsAddedDataGridView.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;
            }
        }
    }
    

    通过重建 DataTable 并重新绑定到它来重新生成值

    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) 在适当的时间调用它(例如,在原始问题中的一系列删除之后):

    dt = ResetAutoIncrementColumn(dt, "ItemNumber");
    dt.Columns["ItemNumber"].SetOrdinal(0);
    dgvView.DataSource = dt;
    dgvView.Columns["ItemNumber"].DisplayIndex = 0;
    

    如果您只是在寻找可视行号

    此外,如果您只是希望在 DataGridView 上有一个可视行号(并且您不关心底层 DataTable 中存在的值),您可以将 DataGridView.RowPostPaint 事件处理为如下(来自https://stackoverflow.com/a/12840794/3085273):

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

    【讨论】:

    • 谢谢,我可以看到这不是一个有效的。似乎很多工作只是为了设置重置增量值。但我认为你是正确的,对于这项工作,应该通过添加每一行来处理递增。索引 +1。我将添加 rowsAdded 和 rowsRemoved 处理程序。
    猜你喜欢
    • 2019-05-11
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2014-01-17
    • 2017-01-02
    • 2015-12-21
    • 2012-03-07
    相关资源
    最近更新 更多