使窗体实例成为公有c#

本文关键字:窗体 实例 | 更新日期: 2023-09-27 18:14:35

我试图将信息从子窗体传递到父窗体。我一直在使用我在论坛上找到的以下代码来帮助我:

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace childform
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 tempDialog = new Form2(this);
        tempDialog.ShowDialog();
    }
    public void msgme()
    {
        MessageBox.Show("Parent Function Called");
    }
}
}

Form2.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace childform
{
public partial class Form2 : Form
{
    private Form1 m_parent;
    public Form2(Form1 frm1)
    {
        InitializeComponent();
        m_parent = frm1;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        m_parent.msgme();
    }
}
}

这是有效的,一切都很好。问题是,我的程序要求我在tempDialog中设置变量,从Form 1,在方法中而不是button1_Click。但是,这些无法找到tempDialog的实例,因为它在button1_click中。

此外,我不能将其移出方法(例如,进入类),因为这样'this'修饰符不会引用Form1…

我如何从Form2引用Form1,反之亦然?使用这个代码还是其他方式?

谢谢

使窗体实例成为公有c#

我不确定你最后关于this的评论是什么意思。创建一个引用Form2的字段,并在构造函数中初始化它。然后在Form1的其他方法中引用_form2

public partial class Form1 : Form
{
    private Form2 _form2;
    public Form1()
    {
        InitializeComponent();
        _form2 = new Form2(this);
    }
    private void button1_Click(object sender, EventArgs e)
    {
        _form2.ShowDialog();
    }
}

当复杂性增加时,这种事情会变得难以理解。一种更好的方法可能是让Form1Form2引用一些它们都可以操作的公共对象。

您可以尝试研究窗体对象上的MdiParent和Parent属性。它们允许您获取和设置父类,并在需要时访问它们的方法。

详细信息请参见MSDN上的Parent属性和MdiParent属性。

根据你的应用,如果你只有一个表单的副本,你在你的应用中显示和隐藏,你可能只能做一个单例静态引用。这将只工作,如果你只实例化表单一次,然而,然后使用show()/hide()在它上使它消失或根据需要重新出现。

public partial class Form2 : Form
{
    public static Form2 Instance;
    public Form2()
    {
        InitializeComponent();
        this.Instance = this;
    }
}

然后,您可以使用以下代码从任何地方访问表单2:

Form2.Instance.xxx