2013-10-16 39 views
1

我通常在我的web項目中使用一個webform來添加和更新數據。我只是抓了winforms環境,所以我想用一種形式來添加和更新數據。一個winform添加和更新數據

我想對addEditForm使用兩個構造像

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

所以,這是正確的做法還是有更好的做法?

謝謝

+0

我認爲這沒關係,我通常做這種方式太。 – VahidNaderi

+0

@VahidND要求回覆,另外一個。我是否需要在每個構造函數中調用InitializeComponent()? – user2783193

+0

@ user2783193是的,你需要在每個構造函數中調用InitializeComponent()。相反,您可以像「public AddEditForm(MyDataObj obj):this()」那樣鏈接構造函數,並在無參數構造函數中調用InitializeComponent()方法。 – Virus

回答

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 
0

您發佈的方法是創建此類表單的常用方法。


但有時你會看到類似這樣的東西。

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

如果你考慮一下,這不是一個好的選擇。這很難理解,看起來很醜。


我需要調用的InitializeComponent()在每一個構造函數?

除非你做的構造函數鏈(這不會在這裏工作),是的,你這樣做。 請查看@Virus答案,以便只調用一次。

+1

這實際上是錯誤的做法.. –

+0

@GY請詳細說明。 – user2783193

+0

@ G.Y我更新了答案以便更好地理解。 – Florian

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

請告訴我這應該如何工作。 – Florian

+0

肯定會在幾秒內加入答案。 –

+0

還在等待...... – Florian

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爲null ,那麼可以在添加模式下考慮表單,否則在編輯模式下考慮表單。

的屬性也可以爲同一個 例如進行:

public bool IsEditMode 
{ 
    get 
    { 
     return (editItem != null); 
    } 
} 

希望它可以幫助...

相關問題