0

我有一个列表框,我必须在其中提供至少 2 个文件进行合并。当我单击合并按钮时,合并完成。进度条启动并出现消息框文件已合并。我正在使用后台工作人员运行进度条。

现在的问题是当合并完成 2 个文件时,我再添加一个文件,单击合并按钮 合并完成消息出现我单击消息框上的确定,再次出现消息框,显示合并已完成的相同消息。此消息框继续出现我在列表框中添加文件的次数。

例如,对于 2 个文件,消息出现 1ce den 在添加 1 个文件时出现消息 2ice,列表框中的 1 个文件消息出现 3ic.Like dis 它继续....

当我使用调试器跟踪它时,我注意到每当我在列表框中添加文件时,我的 Background Worker Runcompleted 事件都会被调用多次。这是合并按钮单击事件的代码...

Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted +=
    new  RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
Worker.WorkerSupportsCancellation = true;

if (!Worker.IsBusy)
    Worker.RunWorkerAsync();
else
    MessageBox.Show("Cannot run background worker twice ");

if (Worker.IsBusy)
{
    progress = new ProgressDialogDTB();
    progress.FormClosing += 
        new FormClosingEventHandler(ProgressDialog_FormClosing);
    progress.ShowDialog(this);
}
while (Worker.IsBusy)
{
    Application.DoEvents();
}

//For Background Worker completed Event...
private void Worker_RunWorkerCompleted(object sender, 
    AsyncCompletedEventArgs e)
{            
    if (progress != null)
    {
        progress.Close();
        progress = null;
    }
    if ( e.Cancelled )
        MessageBox.Show(" Progress was cancelled ");                               

    if (e.Error == null)
        if (!e.Cancelled)
            MessageBox.Show("Files has been merged ");

    if (e.Error != null)
        MessageBox.Show(e.Error.Message);     
}//Worker_RunWorkerCompleted

我不知道我哪里错了。请帮助...谢谢...

4

2 回答 2

3

我猜在每个合并按钮上单击您正在注册一个新的代表。如果出现以下代码:

Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted += new  System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

在合并按钮的单击事件处理程序中考虑将其移动到您的表单初始化方法。您只需要注册一次代表。下次你这样做时,它会添加一个新的,所以第二次合并单击它将运行两次,第三次单击三次,依此类推。

于 2009-06-23T11:51:58.030 回答
2

如果您的工作人员是模块级变量,并且每次单击按钮时都将其附加到其调用列表中,则每次都会调用该方法。假设你点击了 3 次,那么这段代码Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);会被执行 3 次,会被调用 3 次。实例化工作对象时设置一次 Completed 处理程序。

呸! 被它打败了!

于 2009-06-23T11:53:13.660 回答