不能使形式“靠近自己”?

时间:2012-08-08 15:59:15

标签: c# winforms visual-studio-2010

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

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

3 个答案:

答案 0 :(得分:8)

表单在它显示之前试图关闭它(因为你在构造函数中有你的代码)。将您的进度条形码和Close()电话放入FormLoadFormShown活动中。例如:

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