C# 如何将一个窗体的实例传递给另一个窗体

C# 如何将一个窗体的实例传递给另一个窗体,c#,forms,C#,Forms,我有一个名为form1的表单,其中包含在运行时创建的控件 当我按下表单上的一个按钮时,另一个表单加载名为batch,并且form1被隐藏,因此只有一个表单(batch)可见 当我按下batch上的按钮时,我希望显示我的form1表单。但是我无法访问它 以下是我尝试过的: private void combatBtn_Click(object sender, EventArgs e) { Form combat = new Combat(this); th

我有一个名为
form1
的表单,其中包含在运行时创建的控件

当我按下表单上的一个按钮时,另一个表单加载名为
batch
,并且
form1
被隐藏,因此只有一个表单(
batch
)可见

当我按下
batch
上的按钮时,我希望显示我的
form1
表单。但是我无法访问它

以下是我尝试过的:

 private void combatBtn_Click(object sender, EventArgs e)
    {
        Form combat = new Combat(this);
        this.Hide();
        combat.Show();

    }

public partial class Combat : Form
 {

    public Combat(Form form)
    {
        InitializeComponent();
        form.Show();


    }

    private void button1_Click(object sender, EventArgs e)
    {
        form.Show();
    }
}

您需要将父窗体存储在字段中,以便在构造函数外部访问它。

通常不建议将父窗体的实例传递给子窗体。在这种情况下(通常是这样),如果您不:

public partial class Combat : Form
{

    private form1 form;    // Or whatever class you form1 is supposed to be

    public Combat(Form form)
    {
        InitializeComponent();
        this.form = form;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        form.Show();
    }
}
private void combatBtn_Click(object sender, EventArgs e)
{
    Form combat = new Combat();
    this.Hide();
    combat.ShowDialog();
    this.Show();
}
如果需要在关闭子窗体之前显示父窗体,则可以通过以下事件执行此操作:

战斗中
添加:

public event Action MyEvent; //TODO rename to a meaningful name
在按钮单击处理程序中触发事件:

private void button1_Click(object sender, EventArgs e)
{
    MyEvent();
}
然后让主窗体向事件添加处理程序:

private void combatBtn_Click(object sender, EventArgs e)
{
    Combat combat = new Combat();
    this.Hide();
    combat.MyEvent += () => this.Show();
    combat.Show();
}

一般来说,你不想这样做。您不需要将父窗体传递给它的子窗体。从问题中不清楚,以模式显示
battle
对话框是他们试图实现的目标。他们显示父窗体的代码没有关闭子窗体,并且不清楚他们是否想要关闭。@MattBurland添加了另一个解决方案,如果他需要在关闭子窗体之前显示主窗体。+1,一个好的解决方案。我同意最好避免传递对表单的引用。最好避免紧耦合。