【问题标题】:Run a child form process from parent in c#在 C# 中从父级运行子窗体进程
【发布时间】:2012-10-31 06:29:31
【问题描述】:

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

【问题讨论】:

  • 发布您的子表单的代码
  • 可以,请上传你的代码......
  • 欢迎来到 SO!您可以通过编辑将代码添加到您的问题中。这将大大提高可读性;)玩得开心!

标签: c# winforms mdi


【解决方案1】:

在您的子表单中:

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

【讨论】:

  • 感谢您的回答。当我打开子表单时它可以工作,但是当子表单已经打开并且用户在文本框中输入新值时,它不起作用。它将文本框的值返回为 null,尽管它们有值。
  • @user1787601 绝不会如此。您真的有 childForm 实例作为父表单中的成员字段吗?您需要相同的实例才能使 AddValues 函数工作。换句话说,不要做ChildForm cf = new ChildForm(); cf.AddValues(); 它根本行不通。照我贴的去做。或者,如果您不完全了解成员字段是什么,请查看我的编辑。
  • 这里是它的外观链接postimage.org/image/j194eslcd我不想打开子表单。它已经通过单击新按钮在父窗体中打开。现在在“运行”按钮中,即使我调用了 cf.AddValues(),但它给我的错误是文本框是空的,而它们不是。
  • @user1787601 请按照我在代码中的描述打开表单。这就是我能说的。我同意它已经打开,但你不能停止调试,回到代码,重新编辑你的代码吗?编辑打开表单的代码。然后在运行按钮单击下编辑您的代码,如我在代码中所示。
  • 对不起,我不知道验收程序。关于答案,如果我不直接从父表单打开子表单,它是如何工作的。例如,如果我有另一个名为 NewProject 的子表单,当我单击父表单中的新按钮时会打开它。然后在 Newproject 中,我选择项目的类型以及名称和位置,这会相应地打开一个子窗体。再次感谢
猜你喜欢
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多