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,一个好的解决方案。我同意最好避免传递对表单的引用。最好避免紧耦合。