我正在编写一个C# WinForms
应用程序,我有一个表单来编辑对象。表单有一个函数setObject()
,它将对象设置为私有字段,将函数getObject()
设置为获取对象。我在调用表单显示的对话框之前调用了这个函数。
显示表单后,可以编辑对象的值。例如Collection<T>
中的项目可以修改。
如果用户按下取消按钮,我不希望对象保持更改。
如何编写此代码的最佳方法?我应该在显示表单之前复制对象,如果按下取消按钮,替换复制的对象代替编辑的表单对象?
我正在考虑一种情况,我想编辑集合中的对象。在表单上编辑对象后,用户按下取消按钮。然后需要将复制的对象插回到集合中以代替编辑的对象。由于正在插入的对象现在是一个复制的对象,对旧对象的引用检查是否会出现问题?
以下是一些代码来说明:
public class Simple1
{
public Collection<Simple2> simple2Collecton { get; set; }
}
public void simpleFunction()
{
Simple2 obj = simple2Collecton.First();
bool value = (obj == simple2Collecton.First());
}
如果我有Simple2
对象引用simple2Collecton
中的第一项,我在与编辑表单交互后复制Simple1
对象。以下代码仍然是== true
:
bool value = (obj == simple2Collecton.First());
这是我目前复制/克隆对象的代码:
public static T Clone<T>(this object objSource)
{
if (!typeof(T).IsSerializable)
{
throw new ArgumentException("The type must be serializable.", "source");
}
if (Object.ReferenceEquals(objSource, null))
{
return default(T);
}
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, objSource);
stream.Position = 0;
return (T)formatter.Deserialize(stream);
}
}
答案 0 :(得分:0)
我建议您每次打开表单时都保存一个&#34;主要实例&#34; (用于编辑)和私人&#34;固定实例&#34;在编辑它之前,您的对象作为参考。之后,我将使用反射将固定实例复制到新的主实例中并将其绑定到表单。在GetObject()方法中,如果用户按下cancel键,则应始终返回主实例并在它们之间切换。
答案 1 :(得分:0)
这是我用于此目的的方法;
setData(Object)
{
//set object's values to form controls
}
OnEditBtn_Click(Sender,EventArgs)
{
//Iterate over your list and find the object by ID and call setData with
//searched object
//setData(SearchedObjectToEdit); //It will set form controls with the object data
}
Cancel_Button_Click(Sender,EventArgs)
{
//create a new tempObj, instance of the object.
//call setData(tempObj), it will set the blank values to form controls,
//showing that changes has been reverted
}
OnSubmitBtn_Click(Sender, EventArgs)
{
//iterate over your collection and replace the edited object when ID is found
}
根据您的对象复制部分,对象复制将是一个问题,因为它们是引用类型,并且在找不到完全相同的引用之前不会进行交换。
为什么不放弃对cancelBtnClick的更改而不是保存它们。它不会影响Collection中的原始对象。