0

你好。我有一个DataTable列设置AutoIncrement为true。基本上,我将一些文本框值添加到 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 没有更新。

4

1 回答 1

0

由于您不使用真正的数据库,因此使用将DataRow.Delete其设置RowStateDeleted. 您要做的是从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;

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

于 2013-06-14T10:48:22.393 回答