如何从一种形式传递到另一种形式并多次向后传递
本文关键字:另一种 一种 | 更新日期: 2023-09-27 18:34:25
我正在尝试多次从MainForm
传递到InfoForm
以及从InfoForm
传递到MainForm
,但出现了错误:
我已以模式显示的窗体不能显示为模式对话框。在调用 showDialog 之前关闭窗体。
查找了堆栈溢出上的类似问题,但我没有找到适用于我的情况的答案。
所以,这是我在MainForm
的代码:
public MainForm(InfoForm forwardForm) // constructor
{
InitializeComponent();
forwardForm.Visible = false;
}
private void GoBtn_Click(object sender, EventArgs e)
{
InfoForm nextForm = new InfoForm(this);
nextForm.StartPosition = FormStartPosition.CenterParent;
nextForm.ShowDialog(this);
}
而且,这是我在InfoForm
的代码:
public InfoForm(MainForm prevForm) // constructor
{
InitializeComponent();
previous = prevForm;
prevForm.Visible = false;
}
private void BackBtn_Click(object sender, EventArgs e)
{
MainForm backForm = new MainForm(this);
backForm = previous;
backForm.ShowDialog();
}
我需要使用 showDialog()
,因为我希望下一个表单显示在上一个表单的中心。如果我只使用 show()
,那么我的问题就解决了,但我无法在前一个表单的中心显示下一个表单。
编辑:
private void BackBtn_Click(object sender, EventArgs e)
{
MainForm backForm = new MainForm(this);
backForm = previous;
backForm.Show(); // previous code - backForm.ShowDialog();
}
你能解释一下发生了什么吗?这样我的问题一方面解决了,但另一方面,如果我想保留以前形式的内容(文本框和复选框(怎么办?
以下行完全没有意义MainForm backForm = new MainForm(this);
因为它紧跟着这个backForm = previous
。你的意思是这个而不是previous = backForm
?这就是你会得到以下异常的原因(你在同一个MainForm
实例上调用ShowDialog
两次,并且从不调用Close
中间(。
类型为"系统.无效操作异常"的未处理异常 发生在 System.Windows.Forms 中.dll
其他信息:已以模式显示的表单无法 显示为模式对话框。呼叫前关闭表单 显示对话框。
无论如何,我不明白为什么您需要创建多个MainForm
实例,而只是根据需要隐藏/显示单个实例。隐藏/显示单个实例还可以解决您在更新中提到的有关丢失表单控件状态(复选框等(的问题。我假设您希望一次在屏幕上显示一个表单,此外,我还必须填写一些您不显示的缺失内容,例如私有字段声明以及MainForm
必须具有无参数构造函数的事实。
public partial class MainForm : Form
{
InfoForm forwardForm;
public MainForm() // constructor
{
InitializeComponent();
this.forwardForm = new InfoForm(this);
}
private void GoBtn_Click(object sender, EventArgs e)
{
this.Hide();
forwardForm.StartPosition = FormStartPosition.CenterParent;
forwardForm.ShowDialog(this);
}
}
public partial class InfoForm : Form
{
MainForm previous;
public InfoForm(MainForm prevForm) // constructor
{
InitializeComponent();
this.previous = prevForm;
}
private void BackBtn_Click(object sender, EventArgs e)
{
this.Hide();
previous.Show();
}
}