0

これは私が遭遇したばかりの奇妙なことです。

データは頻繁に変更されないルックアップ テーブルであるため、クエリの量を個別に減らすために 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 への参照のように見えるものを返すのはなぜですか (または値) オブジェクトの?

4

1 に答える 1

2

これは仕様によるものです。オブジェクトをアプリケーション状態またはセッション状態に保存すると、アクセス時に実際のオブジェクト (またはオブジェクトへの参照を配置したとき) が返されます。特に指定しない限り、設計上、.NET オブジェクトはほとんどの場合、参照によって渡されます。たとえば、オブジェクトを関数に渡す場合、オブジェクトは参照によって渡されます。

于 2008-12-27T02:06:14.820 に答える