C# 如何在执行方法时在display中显示进度条

C# 如何在执行方法时在display中显示进度条,c#,winforms,C#,Winforms,按钮单击事件代码 private bool ImportData() { bool result = false; bgw.ReportProgress(1); try { bgw.ReportProgress(3); intdevid = int.Parse(cmbDeviceName.SelectedValue.ToString()); Fe

按钮单击事件代码

    private bool ImportData()
    {
        bool result = false;
        bgw.ReportProgress(1);
        try
        {
            bgw.ReportProgress(3);
            intdevid = int.Parse(cmbDeviceName.SelectedValue.ToString());
            FetchDevicedata(intdevid);  // Fetch Remove Device Info from SQL database

            FetchMaxReportId();
            GetFTPFile(strDeviceIP, strDeviceUsername, strDevicePwd, strDevicePath + "//RunningBatch//RunningBatch.db", "RunningBatch.db"); // Copy RunningBatch.db to Debug Folder from Remote 
            LoadRunningData(); // Get Running Data in dataset from running.db
            if (DecodeBatchData_R() == false)
            {
                MessageBox.Show("Running Batch Data Not Found");
            }// save in batch master and row data table
            bgw.ReportProgress(5);
            GetFTPFile(strDeviceIP, strDeviceUsername, strDevicePwd, strDevicePath + "//CompletedBatch//CompletedBatch.db", "CompletedBatch.db");
            LoadCompletedData();
            if (DecodeBatchData() == false)
            {
                MessageBox.Show("Completed Batch Data not found");
            }
            result = true;
            bgw.ReportProgress(7);
        }
        catch (Exception ex)
        {
            clsLogs.LogError("Error: " + ex.Message + this.Name + " || ImportData");
            result = false;
        }
        return result;
    };
后台工作代码

    private void btnimport_Click(object sender, EventArgs e)
    {
        bgw.RunWorkerAsync();

        progressBar1.Visible = true;
        label2.Visible = true;        
        dsCheckRptId = new DataSet();

        if (cmbDeviceName.Text.ToString().Trim() == "--Select--")
        {
           MessageBox.Show("Please Select Proper Device");
           cmbDeviceName.Focus();
           return;

        }
        if (cmbDeviceName.SelectedValue != null && cmbDeviceName.SelectedValue.ToString().Trim() != "0" && cmbDeviceName.SelectedValue.ToString().Trim() != "System.Data.DataRowView" && cmbDeviceName.SelectedValue.ToString().Trim() != "")
        {
            if (ImportData() == true)
            {
                MessageBox.Show("Data Import Completed Successfully for " + strDevicename);
                clsLogs.LogEvent(3, "Data Import Completed Successfully for " + strDevicename);
            }
            else
            {
                MessageBox.Show("Data Import Fail For " + strDevicename);
                clsLogs.LogEvent(3, "Data Import Fail for " + strDevicename);  
            }    
        }         
    };
void bgw\u DoWork(对象发送方,DoWorkEventArgs e)
{
对于(int i=1;i,每次ProgressChanged发生时,您的ProgressBar设置为false。
这意味着它在UI中不再可见

从ProgressChangedMethod中删除可视的更改,这些更改应该可以解决您的问题:

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i <= 100; i++)
        {
            ImportData();
            System.Threading.Thread.Sleep(100);

            bgw.ReportProgress(i);

        }
    }

    void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        label2.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
        label2.Visible = false;
        progressBar1.Visible = false;
    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

    }
然后在BackGroundWorker完成后不显示它:

void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
    label2.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
}
编辑(根据评论):

如果需要BackgroundWorker的结果,则必须将ImportData返回给DoWorkEvents.result属性:

void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    progressBar1.Visible = false;
    label2.Visible = false;
}
然后按照完成的方法进行处理:

void bgw_DoWork(object sender, DoWorkEventArgs e)
{
    e.Result = ImportData();
}

1.您的代码格式和文本格式很难看。请您在其中投入一些精力以使其更具可读性好吗?2.您使用哪种技术?是WPF、WinForms还是ASP.NET?3.我认为即使在此时,这样的常见问题也被多次询问和回答。您在每个ProgressBar上的设置都将可见性从更改为ProgressBar to错误。如果你隐藏它,它应该如何显示?这可能是你想问的另一个问题,因为这个问题是关于如何显示你的进度条你上面的问题是关于在后台工作人员正在做一些工作/已经完成时显示和不显示进度条。根据我提供的更改你的代码应该是do如果没有,那么您在使用ProgressBar执行某些操作时,有一些代码没有提供。第一个是在bgw.RunWorkerAsync()之前放置
progressBar1.Visible=true;
,第二个是为什么要执行
If(ImportData()=true)
在您的单击中?这将是对ImportData方法的第二次调用,该方法将同步运行,并且肯定会阻止您的UI线程,这就是为什么progressbar没有正确显示的原因是……正如我告诉您的那样,如果您想从BackgroundWorker获得ImportData的结果,则另一次同步调用将阻止您的UI使用
bgw.Result=ImportData
然后在
bgw\u runworker completed
中处理此消息框,然后请将此标记为答案,不要忘记对其进行投票,谢谢
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    var result = (bool)e.Result;
    if(result)
    {
        MessageBox.Show("Data Import Completed Successfully for " + strDevicename);
        clsLogs.LogEvent(3, "Data Import Completed Successfully for " + strDevicename);
    }
    else
    {
        MessageBox.Show("Data Import Fail For " + strDevicename);
        clsLogs.LogEvent(3, "Data Import Fail for " + strDevicename);  
    }    
}