0

btn_Connect を押すと、backgroundworker が表示されますが、メッセージボックスで [OK] をクリックするとメッセージボックスが表示され、再度実行されてメッセージボックスが再度表示されます。 btn_Connect をもう一度クリックすると、同じことが行われ、最初のクリックが 2 回インクリメントされます。 btn_Connect を 2 回クリックすると、メッセージボックスが 3 回表示されます。これを修正する方法、

これが私のコードです:

private void testConnection()
    {
        backgroundWorker.ReportProgress(15);

        txt.createConnectionFile(txtServerName.Text, txtDatabase.Text, txtUserName.Text, txtPassword.Text);

        backgroundWorker.ReportProgress(30);

        cn.createConnection();

        backgroundWorker.ReportProgress(60);

        try
        {
            backgroundWorker.ReportProgress(80);

            cn.openConnection();

            MessageBox.Show("Connected!", "Connection Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }

        backgroundWorker.ReportProgress(100);
    }

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
    }

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        testConnection();
    }
private void btnConnect_Click(object sender, EventArgs e)
    {
        progressBar.Visible = true;
        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.WorkerSupportsCancellation = true;
        backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;
        backgroundWorker.DoWork += backgroundWorker_DoWork;

        backgroundWorker.RunWorkerAsync();
    }
4

1 に答える 1

1

ボタンがクリックされるたびに、DoWork イベントと RunWorkerCompleted イベントを接続し続けていることに気付きました。

上記のコードに基づいて、ボタンを初めてクリックしたときに一度実行された後、ボタンが再び有効になると思われます。次にボタンをクリックすると、2 回実行され、次回は 3 回実行されます。

ボタンクリック以外のイベントを接続する必要があります。たとえば、OnLoad で。

それができない場合は、クリックコードを

private void btnConnect_Click(object sender, EventArgs e)
    {
        progressBar.Visible = true;
        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.WorkerSupportsCancellation = true;
        backgroundWorker.ProgressChanged -= backgroundWorker_ProgressChanged;
        backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;

        backgroundWorker.DoWork -= backgroundWorker_DoWork;
        backgroundWorker.DoWork += backgroundWorker_DoWork;

        backgroundWorker.RunWorkerAsync();
    }
于 2012-11-22T05:45:42.723 に答える