2

親フォームに値を戻そうとしています。これに使用していたコードは次のとおりです。ポップアップウィンドウを回避するために、パネルコントロールに子フォームの読み込みを開始するまでは正常に機能していました。

パネルを含むメインフォームのコード

MainMovement child = new MainMovement(new_dat, required_time, number);
child.TopLevel = false;
this.pnlmain.Controls.Add(child);
child.Show();
child.BringToFront();
///Obtaining value back from the child form
string updatingc = child.updatestatus; //This is not working, I am proceeding with some more functions depending on this value, but code does not work here after

子フォームにはupdatestatusとしてパブリック値があり、子フォームを閉じる前に値を設定します。

この値の取得方法を教えてください。child.ShowDialog()に変更することと関係があると思いますchild.Show()。(フォームをパネルにロードするために、これを変更する必要がありました。その前に、これは正常に機能していました)。

4

2 に答える 2

2

メインフォームのオブジェクトをコンストラクターを介して子フォームに渡すことができます。オブジェクトを渡すと、子の親フォームのすべてのメソッドにアクセスできるようになります。メインクラスの任意のパブリックメソッドを呼び出して、値を更新できます。

MainMovement child = new MainMovement(this,new_dat, required_time, number);
child.TopLevel = false;
this.pnlmain.Controls.Add(child);
child.ShowDialog();
child.BringToFront();

メインフォームに1つのパブリックメソッドを入れて、

Public void UpdateValue(String pString)
{
      // Update your value
}

子フォームでは、グローバルオブジェクトで「これ」をキャッチする必要があります。

private oMainForm as MainForm

public void MainMovement(MainForm pObject,String new_dat, String required_time, Int number)
{
     oMainForm = pObject; 
     // Your Code
}

これで、子フォームから「 UpdateValue 」メソッドを呼び出すことができます。

oMainForm.UpdateValue("Updated String");
于 2013-03-16T09:30:18.070 に答える
1

問題は、続行する前に.ShowDialog()待機することですが、フォームを表示して続行するだけです。子フォームがどのように機能しているかを知らずに言うのは難しいですが、私の推測では、子フォームの更新または設定は、コードがその行に到達する前に更新されません。DialogResultShow()updatestatus

考えられる解決策の1つは、コードの大幅なリファクタリングです。updatestatusが変更されたときにトリガーされるイベントをMainMovementフォームに追加できます。私はあなたをに変更し、それをプロパティに変えたこと
に注意してくださいupdatestatusUpdateStatus

public MainMovement : Form
{
    public event EventHandler Updated;
    private void OnUpdateStatus()
    {
        if (Updated != null)
        {
            Updated(this, new EventArgs());
        }
    }

    private String updatestatus;
    public String UpdateStatus
    {
        get { return updatestatus; }
        private set 
        {
            updatestatus = value;
            OnUpdateStatus();
        }
    }

    // rest of your child form code 
}

public ParentForm : Form
{
    public void MethodInYourExample()
    {
        // other code?
        MainMovement child = new MainMovement(new_dat, required_time, number);
        child.Updated += ChildUpdated;
        child.TopLevel = false;
        this.pnlmain.Controls.Add(child);
        child.Show();
        child.BringToFront();
    }

    void ChildUpdated(object sender, EventArgs e)
    {
        var child = sender as MainMovement;
        string updatingc = child.UpdateStatus;
        //rest of your code
    }

}
于 2013-03-16T07:50:54.040 に答える