C# - this.Show(),Close()和Hide()无法正常工作或崩溃

时间:2015-08-25 22:21:23

标签: c# winforms objectdisposedexception

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

这是表单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();
    }
}

这是表格4

public partial class Form4 : Form
{
    public Form4()
    {
        InitializeComponent();
        ...
        ...
        ...
        Form backs= new Form1();
        backs.Show();
        this.Close();

    }

这篇文章的目标如下:当我进入" edit_mode"函数,Form1必须消失才能显示一个新的Form(Form4)。

我'我在这里搜索了很多,但没有解决方案对我有用:编译器没有报告错误,所以当我调试这段代码时,一切似乎都有效;但是当它到达edits.Show(); (在Form1中)它说:ObjectDisposedException错误,我不明白为什么。 我试图用this.Hide()替换this.Close()并且程序运行良好,直到执行Form4的this.Hide()函数: 实际上,当Form4出现并执行其代码时,它会自动停止到this.hide()并且form4不会消失(同时显示为Form1)。 我还尝试在form4中创建一个Button,并在此处移动代码以打开Form1 ..它的效果很好!但我只是一个问题:我不希望用户按下按钮使其正常工作。 所以我需要自动制作这个"表格改变"。

对这个问题有任何想法吗?

1 个答案:

答案 0 :(得分:2)

不确定你在Form4的构造函数中放置的....点中想要实现的是什么,但是可以肯定的是,在构造函数的末尾调用Close会炸掉edits.Show之后调用的Form edits = new Form4(); {1}}
实际上,在那一点上,edits变量指向一个不再可用(处置)的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的构造函数中的点替换的代码移动到Shown事件。显示表单并初始化所有控件时将触发此事件。此时您可以决定关闭实例。

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