在c#中从父级运行子表单进程

时间:2012-10-31 06:29:31

标签: c# winforms mdi

我想从其父级运行MDI子级。例如,我在子表单中有3个文本框。我想在前两个文本框中添加两个值,并在第三个文本框中写入结果。我想在父表单上有一个按钮(让我们称之为运行按钮)为我这样做。此外,我有其他子表单进行其他计算,所以我希望运行按钮的行为符合焦点形式。有谁知道我应该怎么做?

我已经在每个子窗体中编写了一个方法来进行计算,我在父窗体的运行按钮中调用此方法,但是这不识别子窗体文本框的值(即null)。如果有人可以帮助我,那将是非常棒的。

由于

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

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

1 个答案:

答案 0 :(得分:2)

以您的孩子形式:

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

这里的关键是对子表单的同一个实例进行操作。如果您需要它,请将其作为父表单中的成员字段。

修改 如果你不想将子形式变成成员变量,那么你可以依赖C#中的闭包。

以父母形式:

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上的现有点击处理程序。