c#关闭窗体更改值打开新窗体

本文关键字:窗体 新窗体 | 更新日期: 2023-09-27 18:05:06

我正在编写一个应用程序,它要求从一个ComboBox中选择一个输入,然后要求从另一个ComboBox中选择第二个输入(基于第一个输入,每个第一个输入都有不同的可能性)。当两个输入都设置好后,用户点击一个按钮,将这些输入传递给第二个表单,并使用form2.show()打开它(输入通过属性传递)。我想要的是能够关闭这个新表单(这个功能已经完成),然后选择新的输入,并让它再次打开第二个表单,这次使用新的输入。输入改变了在新表单上调用的信息。现在,当我在改变输入后点击打开新表单的按钮时,我的程序崩溃了。

有什么建议吗? !

谢谢!

这是我得到的错误:系统。ObjectDisposedException:不能访问被处置的对象。对象名称:'Form2'.

和代码。

从主形式:

private void button1_Click(object sender, EventArgs e)
    {
        report_form.TypeSelected = type_selected;
        report_form.LoadSelected = load_selected;
        report_form.Show();
    }

从子窗体:

public string TypeSelected { get; set; }
public string LoadSelected { get; set; }
private void Form2_Load(object sender, EventArgs e)
    {
        this.Text = "Report for " + TypeSelected + " load " + LoadSelected;
        label1.Text = "Type: " + TypeSelected;
        label2.Text = "Load: " + LoadSelected;
        dataGridView1.DataSource = bindingSource1;
        GetData();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

c#关闭窗体更改值打开新窗体

从您的代码中,看起来您可能多次显示子表单。当您调用close时,窗体将被dispose,并且在不重新实例化窗体的情况下再次调用show将导致该异常。你要么只需要隐藏你的子窗体而不是关闭它,要么如果你关闭了它,每次你想要显示它的时候重新创建它。(隐藏而不是关闭)

另外,您可以考虑为您的子窗体使用ShowDialog。如果不希望或不需要用户使用父表单,这是收集数据的首选方法……它极大地简化了与子窗体的交互。

High horse:你应该试着把你的应用重构成MVC(模型,视图控制器)。控制器类将决定哪些表单加载打开以及何时打开,并在它们之间传递模型(数据)。这种关注点的分离将极大地帮助你组织你的应用,并远离你的问题。或者MVP也可以:(Model View Presenter)