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

フォームは、表示される前に閉じようとしています(コンストラクターにコードがあるため)。プログレスバーコードを入力し、代わりにorイベントを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();
}
于 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フォームのイベントにあなたのコードを入れてください。

BackgroundWorkerのイベントcalculationProgress.Valueを通じて変更する ProgressChanged

于 2012-08-08T16:11:07.380 に答える