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

时间:2016-02-13 17:14:34

标签: c# forms

我试图多次从MainForm传递到InfoForm,从InfoForm传递到MainForm,但错误出现了:

  

已经以模态方式显示的表单无法显示为模式对话框。在调用showDialog之前关闭表单。

我抬头看了Stack Overflow上的类似问题,但我没有找到适用于我案例的答案。

所以,这是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();
 }
你能解释一下我发生了什么吗?这样我的问题一方面得到解决,但另一方面如果我想保留以前表单的内容(文本框和复选框)怎么办?

1 个答案:

答案 0 :(得分:1)

以下行完全没有意义MainForm backForm = new MainForm(this);,因为紧接着是backForm = previous。你的意思是previous = backForm吗?这就是为什么你会得到以下异常(你在ShowDialog的同一个实例上调用MainForm两次并且从不在它们之间调用Close

  

未处理的类型' System.InvalidOperationException'   发生在System.Windows.Forms.dll

中      

附加信息:已经模态显示的表单不能   显示为模式对话框。在致电之前关闭表格   的ShowDialog。

无论如何,我不明白为什么你需要创建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();
    }
}