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

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

最佳答案

在您的子表单中:

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

关于c# - 在 C# 中从父级运行子表单进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13152415/

相关文章:

c# - 如何使用Winform保存类的当前应用程序状态?

c# - 错误处理整个类

c# - 如何在不关闭应用程序的情况下关闭主窗体?

c# - 图像处理循环中的内存异常(需要比 GC.collect 更好的解决方案)

forms - 所有 MDI 表单关闭时发生的事件

java - 全屏独占模式 JDesktopPane

c# - C# 属性是否可以没有 GetMethod 和 SetMethod

c# - 具有子类/子类的类的单元测试 FluentValidation 规则

c# - 从字符串中删除所有内容,包括XYZ

wpf - 无模式子 WPF 窗口到 native MFC MDI 应用程序