2017-09-27 6 views
0

私のアプリケーションでは、請求書のアイテムを編集しようとしています。複雑化のために、私は多くのテーブルから元のアイテムを削除し、更新されたアイテムを再挿入することにしました。同一のオブジェクトを編集すると他のオブジェクトが変更されます

私のコードでは、元の請求書と更新された請求書という2つのオブジェクトがあります。どちらも同じViewStateオブジェクトにあるため、両方とも同じです。更新された請求書オブジェクトを編集すると、元の請求書オブジェクトも更新されたことがわかりました。

invoiceオブジェクトとアイテムオブジェクトはどちらもシリアル化可能であるため、ViewStateで使用することができます。

私のビジュアルスタジオは動作していますか、これには論理がありますか?

EDIT

 BankCheque originalCheque = (BankCheque)ViewState["OriginalCheque"]; 
     BankCheque cheque = (BankCheque)ViewState["OriginalCheque"]; 
     cheque.chequeCode = tb_chequeCode.Text; 
     cheque.client = new Client(); 
     cheque.client.clientID = hidden_clientId.Value; 
     cheque.chequeIssueDate = DateTime.Parse(tb_issueDate.Text); 
     cheque.chequePaymentDate = DateTime.Parse(tb_paymentDate.Text); 
     cheque.chequeAmount = float.Parse(tb_chequeValue.Text); 
     if (cb_chequePaid.Checked) 
     { 
      cheque.paid = 1; 
     } 
     else 
     { 
      cheque.paid = 0; 
     } 

     cheque.invoices = getNewInvoicesList(); 
     cheque = addPaymentsToCheque(cheque); 

getNewInvoicesList方法が

private List<ClientInvoice> getNewInvoicesList() 
    { 
     DataTable dt = (DataTable)ViewState["invoicesDt"]; 
     List<ClientInvoice> invoices = new List<ClientInvoice>(); 
     ClientInvoice invoice; 
     foreach (DataRow row in dt.Rows) 
     { 
      invoice = new ClientInvoice(); 
      invoice.invoiceID = Convert.ToInt32(row[0].ToString()); 
      invoices.Add(invoice); 
     } 
     return invoices; 
    } 
+0

Visual Studioは、アプリケーションの実行時の動作とは関係ありません。また、コードを見ることなくこれに答える方法はありません。 – Filburt

+1

参照型変数に問題がありますか? https://stackoverflow.com/questions/5057267/what-is-the-difference-between-a-reference-type-and-value-type-in​​-c – VDWWD

+0

私はコードを追加した後、getNewInovicesListメソッドを呼び出した後、オリジナルのチェックも変更されています –

答えて

1

あなたの根本的な問題は、このブロックであるである:

BankCheque originalCheque = (BankCheque)ViewState["OriginalCheque"]; 
BankCheque cheque = (BankCheque)ViewState["OriginalCheque"]; 

あなたのビューステートを読み込むときは、次の2つを作成しています同じオブジェクトへの参照。どちらの変数を操作しても、両方とも同じ基底のオブジェクトを指しているため、両方が変更されます。

あなたがしようとしていることを実行するには、ビューステートを一度読んでからオブジェクトをクローンする必要があります。この場合、すべての子オブジェクトを含む完全に新しいコピーが必要なので、元画像の「ディープコピー」または「ディープクローン」を作成します。 「あなたに、その時点で

BankCheque originalCheque = (BankCheque)ViewState["OriginalCheque"]; 
BankCheque cheque = originalCheque.Clone(); 

:あなたはクローンを作成するためにあなたの方法を持っていたらDeep cloning objects

は、あなたが何かに上のブロックを更新することをお勧めします:この質問に対する答えは、あなたが始めるのに役立つはずです2つの独立したオブジェクトを操作します。

関連する問題