3

私は2つのWinFormsを持っています.1つは親であり、パラメータを子フォームに渡します。コードは次のようになります。

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

いくつかのオプション:

  • 2 番目のフォームでイベント 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 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 : フォーム { プライベート ユーザー ユーザー; 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 に答える
0

単純に値を戻したい場合は、それらを親の public static 変数として公開し、子ウィンドウに設定します。

親:

public static User CurrentUser {get; set;}

子:

FormMain.CurrentUser = user;    
FormMain.CurrentUser.LastName = "Menefee";
于 2012-08-22T12:02:01.097 に答える