C#--此.Show()、Close()和Hide()不工作或崩溃

C#--此.Show()、Close()和Hide()不工作或崩溃,c#,winforms,objectdisposedexception,C#,Winforms,Objectdisposedexception,今天,我使用了很多这些函数,但是我已经发现了一些关于它们的问题。 我的课程结构如下: 这是表格1: public partial class Form1 : Form { public Form1() { InitializeComponent(); ... ... edit = new Button(); edit.Click += new EventHandler((s, e) => edit_m

今天,我使用了很多这些函数,但是我已经发现了一些关于它们的问题。 我的课程结构如下:

这是表格1

public partial class Form1 : Form
{
 public Form1()
    {
        InitializeComponent();
        ...
        ...
        edit = new Button();
        edit.Click += new EventHandler((s, e) => edit_mode(s, e,x,y,c,z)); //x, y, c, z are some variables that I need to pass to purposes of this software.
        this.Controls.Add(edit);
    }
 void edit_mode(object sender, EventArgs e, string x,string y, int c, int z)
    {
        ...
        ...
        Form edits = new Form4();
        edits.Show();
        this.Hide();
    }
}
public partial class Form4 : Form
{
    public Form4()
    {
        InitializeComponent();
        ...
        ...
        ...
        Form backs= new Form1();
        backs.Show();
        this.Close();

    }
这是表格4:

public partial class Form1 : Form
{
 public Form1()
    {
        InitializeComponent();
        ...
        ...
        edit = new Button();
        edit.Click += new EventHandler((s, e) => edit_mode(s, e,x,y,c,z)); //x, y, c, z are some variables that I need to pass to purposes of this software.
        this.Controls.Add(edit);
    }
 void edit_mode(object sender, EventArgs e, string x,string y, int c, int z)
    {
        ...
        ...
        Form edits = new Form4();
        edits.Show();
        this.Hide();
    }
}
public partial class Form4 : Form
{
    public Form4()
    {
        InitializeComponent();
        ...
        ...
        ...
        Form backs= new Form1();
        backs.Show();
        this.Close();

    }
这篇文章的目标如下:当我进入“编辑模式”功能时,Form1必须消失以显示新表单(Form4)

我在这里搜索了很多,但没有一个解决方案对我有效:编译器不会报告我的错误,所以当我调试这段代码时,所有的解决方案似乎都有效;但是当它到达edits.Show()时;(在表格1中)上面写着:ObjectDisposedException错误,我不明白为什么。 我尝试用this.Hide()替换this.Close(),程序运行良好,直到执行Form4的this.Hide()函数: 事实上,当Form4出现并执行其代码时,它会自动停止到this.hide(),而Form4不会消失(当出现Form1时)。 我还尝试在form4中创建一个按钮,并将代码移到此处以打开Form1。。而且效果很好!但我只有一个问题:我不想让用户按下一个按钮来让它工作。 所以我需要自动完成这个“表单更改”


对这个问题有什么想法吗?

不知道你想在……中实现什么目标。。。。在Form4的构造函数中放置点,但可以肯定的是,在构造函数末尾调用Close会破坏
编辑。在
表单编辑=新Form4()之后调用Show

实际上,此时,
edits
变量指向一个不再可用(disposed)的Form4实例

您可以尝试使用这些更改修复代码

void edit_mode(object sender, EventArgs e, string x,string y, int c, int z)
{
    ...
    ...
    this.Hide();
    Form edits = new Form4();
    edits.ShowDialog();
    this.Show();
}


public partial class Form4 : Form
{
    public Form4()
    {
        InitializeComponent();
        this.Shown += Form4_Shown;
        // These lines doesn't make sense because you are creating a 
        // different instance of Form1. This instance (named backs) is 
        // not the same instance that creates the Form4 
        // Form backs= new Form1();
        // backs.Show();

        // Moved to the Form4_Shown event handler
        // this.Close();

    }
    public void Form4_Shown(object sender, EventArgs e)
    {
        // Move here the code that was previously in the constructor
        ....
        ....
        this.Close();
    }
这种方法将用点替换的代码从Form4的构造函数移动到显示的事件中。当窗体显示且所有控件都已初始化时激发此事件。此时,您可以决定关闭该实例


仍然令人费解的是,为什么需要显示一个表单,然后立即关闭它。如果您不需要与用户进行任何交互,您可以选择在类中移动虚线代码,并且从不尝试显示Form4。

为什么需要创建和显示表单(Form4),然后尝试在其构造函数中关闭它?中的代码。。。。不能被Form1直接调用的类方法替换?除了Steve说的。。。您正在创建Form1的新实例。如果要显示已初始化的Form1,则必须在显示Form4之前添加Owner属性:edits.Owner=this;然后从Form4中显示它,您可以这样做。Owner.show();如果试图在已处置对象中执行某些操作,则会发生ObjectDisposedException。调用Close方法后,无法调用Show方法,因为表单的资源已被释放。为什么要在窗体构造函数中关闭窗体?这仍然存在一个老问题,即窗体在创建完成之前已被销毁,因此
ShowDialog()
将失败。@BenVoigt您是对的,需要在显示的事件中移动代码。好吧,form1包含几个使用mysql数据制作的标签和按钮。如果我想正确编辑和显示这些数据,我需要刷新(或者更好地重新启动)所有应用程序。但问题是我不想关闭我的应用程序。因此,为了在不关闭的情况下重新启动所有应用程序,我想使用Form4:它是一个加载表单。。因此有一个名为I的变量,它从0增加到20,并完成了它,我使用backs.show()调用form1,然后重新启动。