2

我有一个表单可以在单击按钮时打开另一个表单。当新表单打开时,我有一个通过循环完成的进度条,然后我希望表单关闭。这是启动新表单的按钮单击事件。

    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 语句之后如何调用该行?

4

3 回答 3

9

表单甚至在显示之前尝试自行关闭(因为您的代码在构造函数中)。输入您的进度条码并Close()调用FormLoadorFormShown事件。例子:

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();
}
于 2012-08-08T16:01:45.527 回答
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();
}
于 2012-08-08T16:03:01.317 回答
0

构造函数用于初始化对象而不破坏构造函数本身的对象。

所以构造函数应该包含初始化代码。

您的代码正在尝试使用构造函数中的 破坏对象,this.Close();因此出现错误。

将您的代码放在Load表单事件中。

calculationProgress.Value通过BackgroundWorker 的 ProgressChanged事件更改

于 2012-08-08T16:11:07.380 回答