2

我想从其父级运行一个 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();
        }
4

1 回答 1

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从初始化部分删除现有的点击处理程序。

于 2012-10-31T06:57:48.233 回答