我通常在我的网络项目中使用一个网络表单来添加和更新数据。我刚刚研究了 winforms 环境,所以我正在考虑使用一种相同的方法来添加和更新数据。
我正在考虑在 addEditForm 上使用两个构造函数,例如
public AddEditForm()
{
.. to do new object
}
public AddEditForm(MyDataObj obj)
{
... to do edit
}
那么,这是正确的方法还是有更好的做法?
谢谢
正如我在评论中所说,我也使用这种方法,当然当我不使用 MVP 时(这是一个不同的故事)
关于调用 InitializeComponent() 您需要在表单构造中使用它,因为它是(从它的名称可以看出)初始化表单和控件的方法,如果没有它,您将获得一个空表单。
但是如果你担心调用 InitializeComponent() 两次,我更喜欢这个:
MyDataObj _myObject;
public AddEditForm()
{
InitializeComponent();
}
public AddEditForm(MyDataObj obj)
:this()
{
if(obj == null) //you're creating the object
_myObject = new MyDataObj();
else // you're editing it
_myObject = obj;
}
// Continue my work with _myObject
您可以通过以下方式创建不同的构造函数:
MyDataObj editItem=null;
public AddEditForm()
{
InitializeComponent();
//Other common code for initialization.
}
public AddEditForm(MyDataObj obj) : this()
{
editItem = obj;
//Other code specific to editing.
}
如果对象editItem
为空,则可以认为表单处于添加模式,否则为编辑模式。
也可以为相同的属性创建一个属性例如:
public bool IsEditMode
{
get
{
return (editItem != null);
}
}
希望能帮助到你...
您发布的方法是创建此类表单的正常方法。
但有时你会看到这样的东西。
public AddEditForm(MyDataObj obj, int mode) //1 = edit, 2 = create
{
... to do edit
}
如果您考虑一下,这不是一个好的选择。它更难理解,而且看起来很丑。
我需要在每个构造函数中调用 InitializeComponent() 吗?
除非您执行构造函数链接(这在此处不起作用),否则您可以。请查看@Virus 答案以了解仅调用一次的方法。
正确的方法是:
public partial class CustomerForm: Form
{
private object instance;
public CustomerForm()
{
InitializeComponent();
SetData(BLL.CreateNewEmptyObject());
}
public CustomerForm(object details)
: this()
{
SetData(details);
}
public void SetData(object details)
{
instance = details;
//bind the details to controls
}
private void Save()
{
BLL.Save(instance);
}
public bool EnableEdit {get{...
}
用法示例:
var newCustomerFrm = new CustomerForm();
var existingCustomerFrmReadOnly = new CustomerForm(BLL.GetCustomerById("123"))
{
EnableEdit = false
};
var existingCustomerFrmToEdit = new CustomerForm(BLL.GetCustomerById("123"))
{
EnableEdit = true
};