您好。我将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没有更新。
答案 0 :(得分:0)
由于您不使用真实数据库,因此使用DataRow.Delete
将RowState
设置为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中,因此它也将被传输到客户端。