1

我通常在我的网络项目中使用一个网络表单来添加和更新数据。我刚刚研究了 winforms 环境,所以我正在考虑使用一种相同的方法来添加和更新数据。

我正在考虑在 addEditForm 上使用两个构造函数,例如

public AddEditForm()
{
   .. to do new object
}
public AddEditForm(MyDataObj obj)
{      
   ... to do edit
}

那么,这是正确的方法还是有更好的做法?

谢谢

4

4 回答 4

2

正如我在评论中所说,我也使用这种方法,当然当我不使用 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
于 2013-10-16T11:41:34.223 回答
2

您可以通过以下方式创建不同的构造函数:

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);
    }
}

希望能帮助到你...

于 2013-10-16T11:43:00.860 回答
0

您发布的方法是创建此类表单的正常方法。


但有时你会看到这样的东西。

public AddEditForm(MyDataObj obj, int mode) //1 = edit, 2 = create
{      
   ... to do edit
}

如果您考虑一下,这不是一个好的选择。它更难理解,而且看起来很丑。


我需要在每个构造函数中调用 InitializeComponent() 吗?

除非您执行构造函数链接(这在此处不起作用),否则您可以。请查看@Virus 答案以了解仅调用一次的方法。

于 2013-10-16T11:29:50.020 回答
0

正确的方法是:

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
    };
于 2013-10-16T11:38:32.560 回答