0

やあ。DataTable列の1つAutoIncrementがtrueに設定されています。基本的に、いくつかのテキスト ボックスの値を DataTable に追加し、それを Grid View にバインドしています。私が達成しようとしているのは、グリッド ビューから行を削除すると、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.Deletewhich を に設定するだけでは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;

補足: a を に保存しないでくださいDataTableViewStateポストバック間で保持する必要がある場合は、Session代わりに を使用してください。セッションはメモリ内に存在しますViewStateが、シリアライズされてレンダリングされた html に保存されるため、クライアントにも転送されます。

于 2013-06-14T10:48:22.393 に答える