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"
对这个问题有什么想法吗?
不确定您想在....中实现什么点放置在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