3

我有 2 个 WinForms,其中一个是父级并将参数传递给它的子窗体。代码是这样的:

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

}

用户类有一些常用属性,如姓名、姓氏等。所以我的问题是如何通知父类有关此更新的信息,而无需再次从数据库中检索用户?

谢谢。

4

4 回答 4

3

一些选项:

  • 在您的第二个表单上定义一个事件 UserUpdated,并在 User 实例中发生任何更改时触发该事件。
  • 在 User 类上实现 INotifyPropertyChanged,并在触发时在主窗体中处理此事件。
于 2012-08-22T12:04:45.203 回答
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);
}
于 2012-08-22T12:08:32.870 回答
0

如果您只是想将值传递回去,那么将它们公开为父级中的公共静态变量并在子窗口中设置它们。

家长:

public static User CurrentUser {get; set;}

孩子:

FormMain.CurrentUser = user;    
FormMain.CurrentUser.LastName = "Menefee";
于 2012-08-22T12:02:01.097 回答
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();
    }

}

公共部分类Form1:Form {私人用户用户;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");
    }
}
于 2012-08-22T14:00:06.033 回答