C# 在c中从父级运行子窗体进程#

C# 在c中从父级运行子窗体进程#,c#,winforms,mdi,C#,Winforms,Mdi,我想从其父级运行MDI子级。例如,我在子窗体中有3个文本框。我想在前两个文本框中添加这两个值,并在第三个文本框中写入结果。我想在父窗体上有一个按钮(我们称之为run按钮)来为我执行此操作。此外,我还有其他子窗体,它们执行其他计算,因此我希望运行按钮的行为符合聚焦窗体。有人知道我该怎么做吗 我在每个子窗体中编写了一个方法来进行计算,并在父窗体的“运行”按钮中调用此方法,但这无法识别子窗体文本框(即null)的值。如果有人能帮我,那就太棒了 谢谢 代码非常简单 我在子窗体中有三个文本框,在前两个中有

我想从其父级运行MDI子级。例如,我在子窗体中有3个文本框。我想在前两个文本框中添加这两个值,并在第三个文本框中写入结果。我想在父窗体上有一个按钮(我们称之为run按钮)来为我执行此操作。此外,我还有其他子窗体,它们执行其他计算,因此我希望运行按钮的行为符合聚焦窗体。有人知道我该怎么做吗

我在每个子窗体中编写了一个方法来进行计算,并在父窗体的“运行”按钮中调用此方法,但这无法识别子窗体文本框(即null)的值。如果有人能帮我,那就太棒了

谢谢

代码非常简单 我在子窗体中有三个文本框,在前两个中有用户输入值,我想单击父窗体上的run按钮,子窗体中第三个文本框的值成为前两个文本框值的总和。我在子窗体中有这个方法,我可以从父窗体调用它,但它不起作用

public void AddValues()
        {
            double a = double.Parse(textBox1.Text);
            double b = double.Parse(textBox2.Text);
            textBox3.Text = (a + b).ToString();
        }
以我的父母形式

private void button1_Click(object sender, EventArgs e)
        {
            ChildFrom child = new ChildFrom();
            child.AddValues();
        }
在您的子表单中:

public void AddValues() //add error handling
{
    double a = double.Parse(textBox1.Text);
    double b = double.Parse(textBox2.Text);
    textBox3.Text = (a + b).ToString();
}
在父窗体中,必须在打开的子窗体的同一实例上调用
AddValues
。换句话说,在父形式中:

public partial class ParentForm : Form
{
    ChildForm _cF; //member field

    public ParentForm()
    {
        InitializeComponent();
    }

    private void OpenChildForm() //this is how you should open the form
    {                            //call this function in whichever event 
         _cf = new ChildForm();  //you are opening the child form.
         _cf.Show();
    }   

    private void button1_Click(object sender, EventArgs e)
    {
        //please remove these lines, its wrong!
        //ChildFrom child = new ChildFrom();
        //child.AddValues();

        //do this instead:
        _cf.AddValues();
    }
}
private void OpenChildForm()
{
     ChildForm cf = new ChildForm();
     cf.Show();

     btnRun.Clicked -= OnRunButtonClicked(cf); //important - to avoid multiple-
     btnRun.Clicked += OnRunButtonClicked(cf); //handlers getting attached.
}  

private EventHandler OnRunButtonClicked(ChildForm cf)
{
    return (sender, e) => cf.AddValues();
}
这里的关键是对子窗体的同一实例进行操作。如果您在整个过程中都需要它,请将其作为父窗体中的成员字段

编辑: 如果您不希望子窗体成为成员变量,那么您可以依赖C#中的闭包

以家长形式:

public partial class ParentForm : Form
{
    ChildForm _cF; //member field

    public ParentForm()
    {
        InitializeComponent();
    }

    private void OpenChildForm() //this is how you should open the form
    {                            //call this function in whichever event 
         _cf = new ChildForm();  //you are opening the child form.
         _cf.Show();
    }   

    private void button1_Click(object sender, EventArgs e)
    {
        //please remove these lines, its wrong!
        //ChildFrom child = new ChildFrom();
        //child.AddValues();

        //do this instead:
        _cf.AddValues();
    }
}
private void OpenChildForm()
{
     ChildForm cf = new ChildForm();
     cf.Show();

     btnRun.Clicked -= OnRunButtonClicked(cf); //important - to avoid multiple-
     btnRun.Clicked += OnRunButtonClicked(cf); //handlers getting attached.
}  

private EventHandler OnRunButtonClicked(ChildForm cf)
{
    return (sender, e) => cf.AddValues();
}

注意从初始化部分删除
btnRun
上现有的点击处理程序。

发布您的子表单的代码。如果可以,请上传您的代码………欢迎使用SO!您可以通过编辑将代码添加到问题中。这将大大提高可读性;)玩得高兴谢谢你的回答。当我打开子窗体时,它工作,但当子窗体已经打开并且用户在文本框中输入新值时,它不工作。它将文本框的值返回为null,尽管它们有值。@user1787601,这种情况永远不会发生。在父窗体中是否确实有子窗体实例作为成员字段?您需要相同的实例才能使
AddValues
函数工作。换句话说,不要执行
ChildForm cf=new ChildForm();cf.AddValues()它根本不起作用。照我贴的去做。或者,如果您对成员字段的概念不了解,请参阅我的编辑。以下是它的外观链接,我不想打开子窗体。通过单击“新建”按钮,它已在父窗体中打开。现在在“运行”按钮中,我甚至调用了cf.AddValues(),但它给了我一个错误,即文本框是空的,而不是空的。@user1787601请按照我在代码中描述的方式打开表单。这就是我所能说的。我同意它已经打开了,但是你不能停止调试,返回代码,重新编辑你的代码吗?编辑打开表单的代码。然后在“运行”按钮下编辑您的代码,如我的代码中所示。抱歉,我不知道验收程序。关于答案,如果我不直接从父窗体打开子窗体,它是如何工作的。例如,如果我有另一个名为NewProject form的子窗体,当我单击父窗体中的“新建”按钮时,该窗体将打开。然后在Newproject中,我选择项目的类型、名称和位置,这将相应地打开一个子窗体。再次感谢