これは私が遭遇したばかりの奇妙なことです。
データは頻繁に変更されないルックアップ テーブルであるため、クエリの量を個別に減らすために ApplicationCache に格納された小さな DataTable を持つ Web アプリケーションがあります。
特定のページ内でこの DataTable に 2 回アクセスします。Page_Load メソッドでデータをドロップダウン リストにバインドするには、次のようにします。
dtDeptDivAct = GetAllDeptDivActCodes()
dtDeptDivAct.DefaultView.Sort = "LongDescription ASC"
ddlDeptDivAccount.DataSource = dtDeptDivAct.DefaultView
ddlDeptDivAccount.DataTextField = "LongDescription"
ddlDeptDivAccount.DataValueField = "Id"
ddlDeptDivAccount.DataBind()
...そして、ddlDeptDivAct_SelectedIndexChanged イベントでインデックスが選択されたときに、テーブルから追加のデータを取得するために 1 回:
Dim dtDeptDivAct As DeptDivActDataTable
If ddlDeptDivAccount.SelectedIndex > 0 Then
dtDeptDivAct = GetAllDeptDivActCodes()
dtDeptDivAct.DefaultView.RowFilter = "Id = " & ddlDeptDivAccount.SelectedValue
txtAddFundingDept.Text = DirectCast(dtDeptDivAct.DefaultView(0).Row, DeptDivActRow).Department.ToString.PadLeft(2, Char.Parse("0"))
txtAddFundingDiv.Text = DirectCast(dtDeptDivAct.DefaultView(0).Row, DeptDivActRow).Division.ToString.PadLeft(2, Char.Parse("0"))
txtAddFundingAct.Text = DirectCast(dtDeptDivAct.DefaultView(0).Row, DeptDivActRow).Activity.ToString.PadLeft(3, Char.Parse("0"))
Else
txtAddFundingDept.Text = ""
txtAddFundingDiv.Text = ""
txtAddFundingAct.Text = ""
End If
注: GetAllDeptDivActCodes() メソッドは、ApplicationCache オブジェクトからテーブルを返す単純なメソッドです。
Web ページは正常に動作します。値を選択すると、適切な値が TextBox に挿入されます。しかし、別のページに移動してこのページに戻ってきたとき。ドロップダウン リストには、選択できる値が 1 つしかありません。
デバッガーを起動すると、Web ページに戻ったときに、GetAllDeptDivActCodes メソッドがキャッシュから DataTable を返すときに、DefaultView の RowFilter プロパティがまだ DataTable に適用されていることに気付きました。これが問題の原因でした。
SelectedIndexChanged イベントで処理が完了したら、DefaultView RowFilter をリセットするだけで問題を解決しましたが、別のコピーを期待していたときに、アプリケーションがアプリケーション キャッシュ内の DataTable への参照のように見えるものを返すのはなぜですか (または値) オブジェクトの?