我有一个表单,在单击按钮时打开另一个表单。当新表单打开时,我通过循环完成了一个进度条,然后我希望表单关闭。这是启动新表单的按钮单击事件。
private void calculateButton_Click(object sender, EventArgs e)
{
if (checkFormComplete())
{
ProgressForm proForm = new ProgressForm();
proForm.Show();
}
}
以下是完成进度条的新表单的代码,该进度条应该自行关闭。
public ProgressForm()
{
InitializeComponent();
for (int i = 0; i < 101; i++)
calculationProgress.Value = i;
this.Close();
}
然而,在运行时我得到:
无法访问已处置的对象。对象名称:'ProgressForm'。
调试器指向我主要形式的这一行:
proForm.Show();
我不确定我理解为什么,或者正确的做法是什么。如何在我的新表单中的close语句之后调用该行?
答案 0 :(得分:8)
表单在它显示之前试图关闭它(因为你在构造函数中有你的代码)。将您的进度条形码和Close()
电话放入FormLoad
或FormShown
活动中。例如:
private void ProgressForm_Shown(object sender, EventArgs e)
{
for (int i = 0; i < 101; i++)
{
calculationProgress.Value = i;
Application.DoEvents(); // force the form to update itself
}
this.Close();
}
答案 1 :(得分:2)
在尝试关闭表单之前允许加载完成: - )
您应该在Form_Load事件中启动进度条循环。
但是请注意,像这样循环会导致表单锁定,直到进度条完成渲染。
在后台线程中执行进度循环。 BackgroundWorker是运行进度循环的理想选择。
public proForm()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}
proForm_Load()
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
(int i = 0; i < 101; i++) worker.ReportProgress(i);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Close();
}
答案 2 :(得分:0)
构造函数用于初始化一个对象,而不是破坏构造函数本身中的对象。
因此构造函数应该包含初始化代码。
您的代码正在尝试使用构造函数中的this.Close();
销毁对象,因此会出错。
将您的代码放入Form {。{1}}事件中。
通过 BackgroundWorker的 Load
事件更改calculationProgress.Value