2011-08-10 9 views
0

DataTableに格納されているSessionに問題があり、このコードをSessionから取得するとコードが実行されます。たぶん、これは問題ではなく、インスタンスと参照が実際にどのように機能するかを間違って理解しているだけかもしれません。C#DataTableの複数のインスタンスがセッションに格納されています。

私はログインしたユーザーのすべてのデータを格納するPOCOクラスUserを持っています。ユーザーは(ログインページ上)に記録されたら、私はUserクラスのインスタンスを作成し、私はSession["User"]にログインから取得したすべてのデータを格納

public class User 
{ 
    public int UserID { get; set; } 
    public string UserFirstName { get; set; } 
    public string UserLastName { get; set; } 
    public DataTable UserRights { get; set; } 
} 

User _user = new User(); 
_user = MyLogin.GetUser() // method returns filled User object with data from db 
Session["User"] = _user; // I store it into session 

POCOクラスは次のようになりその後、私は(データテーブルに格納されている)ユーザー権利のセッションからのデータを必要とする私のページに私がセッションに見て、DataTableを取得:

User _currUser = (User)Session["User"]; 
DataTable dt = new DataTable(); 
dt = _currUser.UserRights; 

このコード私はDataTable UserRightsのセッションを見て同じページ上で複数回回してみると、奇妙な動作が始まります

例:ページに2つのユーザーコントロールがあり、それぞれの1つでは、上記のコードのようにDataTableのセッションを調べます。その後、私は、例えば、このようなユーザーコントロールコードのいずれかでDataTableオブジェクトのインスタンスを変更する場合:

dt.Columns.Remove("RoleID"); 

...第2のユーザ制御の変化の影響インスタンスすぎる(??)。インスタンスに異なる名前を与えた場合と同じになります:これが起こっているとインスタンスと参照が、この例ではどのように機能するか(それは私がそれらを正しく理解していないに見えます)なぜ

// FirstUserControl.ascx.cs 
User _currUser1 = (User)Session["User"]; 
DataTable dt1 = new DataTable(); 
dt1 = _currUser1.UserRights; 
dt1.Columns.Remove("RoleID") 

// SecondUserControl.ascx.cs 
User _currUser2 = (User)Session["User"]; 
DataTable dt2 = new DataTable(); 
dt2 = _currUser2.UserRights; <--- dt2 is without column "RoleID" too!? 

は、明確な方法で誰かが私に説明することができます

。私はいつも、私が上記のようなコードを実行すると、それらを処理するときに何も共通しない dt1dt2 DataTableオブジェクトを得るだろうと思っていました。

答えて

2

DataTableは参照型です.dt1とdt2は、データテーブルを保持するメモリのチャンクのメモリアドレスです。常に同じオブジェクトを参照します。

あなたが DataTable.Copy()

User _currUser1 = (User)Session["User"]; 
DataTable dt1 = _currUser1.UserRights.Copy(); 
dt1.Columns.Remove("RoleID") 

// SecondUserControl.ascx.cs 
User _currUser2 = (User)Session["User"]; 
DataTable dt2 = _currUser2.UserRights.Copy(); 
を使用することができます。この場合

関連する問題