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();

在您的主要形式中放置一种公共方法,

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

在您的子表单中,您必须使用全局对象来捕捉“this”。

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()等待DialogResult,而Show()只是显示表单并继续。很难说不知道您的子表单是如何工作的,但我的猜测是updatestatus您的子表单中的任何更新或设置在您的代码到达该行之前都不会更新。

一种可能的解决方案涉及对代码进行重大重构。您可以向 MainMovement 表单添加一个在updatestatus更改时触发的事件。
请注意,我将您更改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 回答