在我的申请中,我正在尝试编辑发票的项目。由于复杂性,我选择从多个表中删除原始项目并重新插入更新的项目。
在我的代码中,我有两个对象,原始发票和更新的发票。两者都是相同的,因为它们都来自同一个ViewState对象。当我编辑更新的发票对象时,我发现原始发票对象也已更新。
请注意,发票对象和项目对象都是序列化的capeable,因此我可以在ViewState中使用它们。
我的视觉工作室是否正常运作或背后是否存在逻辑?
修改
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 :(得分:1)
您的根本问题在于此块:
BankCheque originalCheque = (BankCheque)ViewState["OriginalCheque"];
BankCheque cheque = (BankCheque)ViewState["OriginalCheque"];
当您在视图状态中读取时,您将创建对同一对象的两个引用。无论你操纵哪个变量,两者都会改变,因为它们都指向同一个底层对象。
为了完成您尝试做的事情,您需要一次读取视图状态,然后克隆该对象。在这种情况下,因为你想要一个全新的副本 - 包括所有的子对象 - 你要做的就是制作一个&#34;深拷贝&#34;或者&#34;深度克隆&#34;原来的。这个问题的答案可以帮助您入门:Deep cloning objects
一旦你有了克隆的方法,你就会想要将上面的块更新为:
BankCheque originalCheque = (BankCheque)ViewState["OriginalCheque"];
BankCheque cheque = originalCheque.Clone();
此时,您将有两个独立的对象进行操作。