c#——this.Show(),Close()和Hide()不工作或崩溃

本文关键字:工作 崩溃 Hide this Show Close | 更新日期: 2023-09-27 18:09:53

今天,我使用了很多这些函数,但我已经发现了一些问题。我的程序是这样组织的:

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

这是Form 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中创建一个按钮,并在这里移动代码以打开Form1..而且效果很好!但我只有一个问题:我不希望用户按下按钮来让它工作。所以我需要自动设置这个"Form change"

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

c#——this.Show(),Close()和Hide()不工作或崩溃

不确定您想在....中实现什么点放置在Form4的构造函数中,但可以肯定的是,在构造函数末尾调用Close将会在Form edits = new Form4();
之后调用edits.Show。事实上,在这一点上,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的构造函数移动到显示事件。此事件在显示表单并且已初始化所有控件时触发。此时,您可以决定关闭实例。

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