2012-08-22 51 views
3

我有2個WinForms其中一個是父母並將參數傳遞給它的chilf形式。該代碼是這樣的:如何通知父母有關財產變化

public class FormMain : Form { 
private User user; 

public FormMain (User user) { 
InitializeComponent(); 
this.user = user; 
} 

private void btnUpdateAccount_Click(object sender, EventArgs e) 
     { 
      updateUser = new FormUsersUpdate(user); 
      updateUser.Show(); 
     } 
} 

這:

public class FormUsersUpdate(User user){ 

//Update user in database 

} 

User類有一些常用的屬性,如姓名,等等。所以我的問題是如何通知父類有關此更新不需要再次從數據庫中檢索用戶?

謝謝。

+0

要告知父類什麼更新? – franssu

回答

3

更新後可以調用回調委託。在FormMain

private void btnUpdateAccount_Click(object sender, EventArgs e) 
{ 
    updateUser = new FormUsersUpdate(user, new Action<User>(OnUserUpdated)); 
    updateUser.Show(); 
} 

private void OnUserUpdated(User user) 
{ 
    // Whatever you wanted to do with the updated user. 
} 

FormUsersUpdate

public class FormUsersUpdate(User user, Action<User> callback) 
{ 
    // Update user, then invoke the callback using the updated user instance, 
    // which will call the OnUserUpdated method of the FormMain: 
    callback.Invoke(user); 
} 

ShowDialog的主要是一個更好的選擇,但我從來沒有嘗試過的MDI子:

private void btnUpdateAccount_Click(object sender, EventArgs e) 
{ 
    updateUser = new FormUsersUpdate(user); 
    updateUser.ShowDialog(); 

    // Will wait until the user closes the dialog box. 
    // FormUserUpdate keeps the updated user in a property called User: 
    OnUserUpdated(updateUser.User); 
} 
+0

當您想調用父項上的事件但在此情況下不需要時,委託很有用。他只是想把對象傳給父母。 – Menefee

+0

@Menefee:最簡單的方法是使用ShowDialog和FormUsersUpdate類中的更新用戶屬性。但使用委託也是一個有效的解決方案,因爲調用委託並不比調用常規方法慢,我不認爲這種方法具有令人擔憂的缺點。 –

+0

@Menefee:如果我不調用一個方法或一個委託,或者引發一個事件,那父母怎麼知道這個值會被改變? –

0

如果您只是想將值傳遞回來,然後將它們公開爲父級中的公共靜態變量並將它們設置在子窗口中。

家長:

public static User CurrentUser {get; set;} 

兒童:

FormMain.CurrentUser = user;  
FormMain.CurrentUser.LastName = "Menefee"; 
+1

不是很好的使用靜態字段..如果你想創建幾個FormMain呢? – franssu

+0

父母如何知道「FormUsersUpdate」已更新並且CurrentUser包含更新後的值? –

+0

@franssu我通常會同意,但考慮到規範給出這是最簡單的解決方案。 – Menefee

3

一些選項:

  • 定義UserUpdated你的第二個窗體上的事件,並在任何改變發生在觸發事件用戶實例。
  • 在User類上實現INotifyPropertyChanged,並在觸發時在主表單中處理此事件。
+0

在FormUsersUpdate類中定義了一個委託和一個事件,現在我無法引發一個事件。這可能是由於FormUsersUpdate是一個部分類。 –

+0

查看我對這個問題的回答,瞭解如何定義事件。 http://stackoverflow.com/questions/12002820/update-view-from-another-view/12003071#12003071 – Maarten

+0

謝謝我糾正了錯誤。它正在工作。 –

0

下面是工作樣例以上問題使用代表和事件:

public partial class FormUsersUpdate : Form 
{ 
    private readonly User user; 
    public delegate void UserChangedEventHandler(object sender, EventArgs e); 
    public event UserChangedEventHandler UsrChanged; 

    private void InvokeUsrChanged() 
    { 
     var args = new EventArgs(); 
     if (UsrChanged != null) UsrChanged(this, args); 
    } 

    public FormUsersUpdate() 
    { 
     InitializeComponent(); 
    } 

    public FormUsersUpdate(User usr) 
    { 
     InitializeComponent(); 
     this.user = usr; 
     this.user.name = "Kishore"; 
    } 

    private void FormUsersUpdate_Load(object sender, EventArgs e) 
    { 
     InvokeUsrChanged(); 
    } 

} 

public partial class Form1:Form { private user user; FormUsersUpdate _frmusrUpdate;

public Form1() 
    { 
     InitializeComponent(); 
     this.user = new User { name = "Test" }; 
    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     _frmusrUpdate = new FormUsersUpdate(this.user); 
     _frmusrUpdate.UsrChanged += new FormUsersUpdate.UserChangedEventHandler(_frmusrUpdate_UsrChanged); 
     _frmusrUpdate.Show(); 
    } 

    void _frmusrUpdate_UsrChanged(object sender, EventArgs e) 
    { 
     MessageBox.Show("User Details Changed"); 
    } 
}