3

ViewStateでDataTableを割り当てています。

public void Method1()
{    
    DataTable dt = getData(); //Gets the Data

    ViewState["dtThis"] = dt;
}

' Method2 'が実行されると、 ViewStateがDataTableに割り当てられます。

public void Method2()
{    
    DataTable dt2 = (DataTable)ViewState["dtThis"];

    dt2.Columns.Remove("FirstName");    //Removing a column

    dt2.AcceptChanges();
}

Method2の実行後、(DataTable)ViewState( "dtThis")チェックすると、 dt2をViewState( " dtThis ")に割り当てなくても、DataTabledt2が含​​まれていることがわかります。(列- "FirstName"がViewSate( "dtThis")DataTableで削除されることを意味します)。

ViewStateのこのタイプの動作がなぜあるのか考えてみてください。

そして、元のViewStateを維持する方法は?

4

3 に答える 3

6

データテーブルの参照をビューステートに保存しています。したがって、で行われた更新viewstate["dtThis"]は、で割り当てられた元のDatatableobjに直接影響しmethod1()ます。

元のビューステートデータテーブルを保持する1つの方法は、DataTable.Copy()を使用して元のレプリカを作成し、そのレプリカを操作することです。

于 2012-06-01T11:14:11.730 に答える
1

理由はわかりませんが、私にも起こりましたが、その時は少し急いでいたので、別の方法を選びました。ViewStateからdatatableを取得するとき、新しいテーブルを作成し、元のテーブルのレコードをループして、新しいテーブルに値を設定しました:)そのため、ビューステートテーブルは変更されませんでした。

于 2012-06-01T11:19:57.593 に答える
0

このように使用すると、参照の問題が解決します

DataTable dt2= ( (DataTable)ViewState["dtThis"]).Copy(); 
于 2013-12-06T07:23:50.530 に答える