如何从一种形式传递到另一种形式并多次向后传递

本文关键字:另一种 一种 | 更新日期: 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();
    }
}