DataTable删除行后减去列值

时间:2013-06-14 10:41:05

标签: c# asp.net datagridview datatable

您好。我将DataTable列中的一个设置为AutoIncrement为真。基本上我将一些文本框值添加到DataTable,然后将其绑定到网格视图。我想要实现的是,如果我从网格视图中删除一行,则还需要删除DataTable中的行并减少主键列。

DataTable声明为此private DataTable table = new DataTable();,代码为:

DataColumn promoDetailsID = new DataColumn();
promoDetailsID.ColumnName = "promoDetailsID";
promoDetailsID.DataType = System.Type.GetType("System.Int32");
promoDetailsID.AutoIncrement = true;
promoDetailsID.AutoIncrementSeed = 1;
promoDetailsID.AutoIncrementStep = 1;
table.Columns.Add(promoDetailsID);
table.Columns.Add("StartRange", typeof(string));
table.Columns.Add("EndRange", typeof(string));
table.Columns.Add("Amount", typeof(string));
table.Columns.Add("AllocationCases", typeof(string));
table.Columns.Add("AllocationUnits", typeof(string));
if (ViewState["dtTable"] != null)
{
    table = (DataTable)ViewState["dtTable"];
}
table.Rows.Add(null,TxtStartRange.Text.Trim(), TxtEndRange.Text.Trim(), TxtAllocationAmount.Text.Trim(), TxtAllocationCases.Text.Trim(), TxtAllocationUnits.Text.Trim());
grdPromotions.DataSource = table;
grdPromotions.DataBind();
ViewState["dtTable"] = table;

当我尝试从网格中删除行时,这是代码。

 protected void grdPromotions_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {

        if (ViewState["dtTable"] != null)
        {
            table = (DataTable)ViewState["dtTable"];
            int rowIndex = Convert.ToInt32(e.RowIndex);
            table.Rows[e.RowIndex].Delete();
        }
        table.AcceptChanges();
        grdPromotions.DataSource = table;
        grdPromotions.DataBind();
        ViewState["dtTable"] = table;

    }

我没有收到任何错误,但删除后DataTable没有更新。

1 个答案:

答案 0 :(得分:0)

由于您不使用真实数据库,因此使用DataRow.DeleteRowState设置为Deleted是没有意义的。您要做的是从DataTable删除行。

table.Rows.RemoveAt(e.RowIndex);

如果您还想减少主键列,则必须使列可写:

table.Columns[0].ReadOnly = false;

然后您需要手动更新值:

int counter = 0;
foreach(DataRow row in table.Rows)
{
    row[0] = ++counter;
}
table.Columns[0].ReadOnly = true;

旁注:请勿在{{1​​}}中存储DataTable,如果您需要在回发之间保留它,请使用ViewState。会话存在于内存中,而Session将被序列化并存储在呈现的html中,因此它也将被传输到客户端。