我创建了一个用于添加和编辑自定义对象的表单。表单采用的模式由从调用代码传递的枚举值提供。我还传入了自定义类型的对象。我对数据的所有控件都绑定到自定义对象的特定属性。当表单处于“添加”模式时,这非常有效,因为当使用数据更新控件时,底层对象也是如此。但是,在编辑模式下,我保留了调用代码提供的自定义对象的两个变量,原始代码和通过深度复制生成的临时代码。然后将控件绑定到临时副本,这样,如果用户单击“取消”按钮,则可以轻松地放弃更改。我想知道的是,如果用户单击“确定”按钮,如何将这些更改保留回原始对象,因为现在由于深度复制而断开连接。我试图避免在添加/编辑表单上实现内部属性,如果可以的话。以下是我的代码示例:
public AddEditCustomerDialog(Customer customer, DialogMode mode)
{
InitializeComponent();
InitializeCustomer(customer, mode);
}
private void InitializeCustomer(Customer customer, DialogMode mode)
{
this.customer = customer;
if (mode == DialogMode.Edit)
{
this.Text = "Edit Customer";
this.tempCustomer = ObjectCopyHelper.DeepCopy(this.customer);
this.customerListBindingSource.DataSource = this.tempCustomer;
this.phoneListBindingSource.DataSource = this.tempCustomer.PhoneList;
}
else
{
this.customerListBindingSource.DataSource = this.customer;
this.phoneListBindingSource.DataSource = this.customer.PhoneList;
}
}
答案 0 :(得分:0)
您可以随时向对象(客户)添加一个函数,作为“复制(客户托管)”或“更新(客户托管)”并以此方式使用这些更改。
另一种方法是在Customer EditableCustomer周围设置一个包装类,它在其构造函数EditableCustomer(Customer root)中获取客户对象,并使用它来保存更改。在最后一个事件中,只需调用类似“UpdateRoot()”的函数并将更改填充回原始客户,如果没有调用,则将与丢弃相同。
您无法直接使用深层拷贝,但这将允许您控制此类情况,实际上允许您动态控制编辑和撤消。