c# .net中Winforms之间的值传递

本文关键字:值传 之间 Winforms net | 更新日期: 2023-09-27 18:04:05

我试图获得一个值返回到父窗体,下面是我使用的代码,它工作正常,直到开始在面板控件中加载子窗体,以避免弹出窗口。

包含Panel

的mainform中的代码
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()有关。(为了将表单加载到面板中,我必须改变这一点,在此之前这是正常工作的)。

c# .net中Winforms之间的值传递

您可以通过构造函数将主表单的对象传递给子表单。如果您传递您的对象,您将有权访问子窗体中父窗体的所有方法。你可以调用任何main类的公共方法来更新你的值。

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

问题是.ShowDialog()在继续之前等待DialogResult,而Show()只是显示表单并继续。这很难说不知道你的子窗体是如何工作的,但我的猜测是,无论更新或设置updatestatus在你的子窗体不更新之前,你的代码到达那一行。

一个可能的解决方案涉及对代码进行重大重构。你可以在你的MainMovement表单中添加一个事件,当updatestatus被改变时触发。
请注意,我将updatestatus更改为UpdateStatus,并将其转换为属性

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
    }
}