一个通知添加和更新数据

本文关键字:添加 更新 数据 通知 一个 | 更新日期: 2023-09-27 18:35:39

我通常在我的Web项目中使用一个Web表单来添加和更新数据。我只是划伤了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为 null,则可以在"添加"模式下考虑表单,否则可以考虑在"编辑"模式下。

也可以

为相同的属性制作例如:

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