我通常在我的网络项目中使用一个网络表单来添加和更新数据。我刚刚研究了 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
    };