进度条没有进展

时间:2012-01-26 14:31:12

标签: c# winforms

我是C#的新手,只想问一个问题。

我正在开发一个Windows应用程序,并尝试插入一个进度条,当我从另一个名称空间调用它时,该进度条不起作用。

我的代码:

namespace CLT
{
    public partial class GenBulkReceipts : UserControl
    {
        public void ProressBarMovement()
        {
            progressBar1.PerformStep();
        }

        public void LoadProgressBar(int progressbarMax)
        {
            progressBar1.Minimum = 1;
            progressBar1.Maximum = progressbarMax;
            progressBar1.Value = 1;
            progressBar1.Step = 1;
        }

private void btnOpen_Click(object sender, EventArgs e)
{
   try
   {
     OpenFile();
    }
}

private void OpenFile()
{
       if (dsEx1.Tables[0].Rows.Count > 0)
      {
        AccountsToBeImported = new BLLService().Get_AccountsToBeReceipted(dsEx1);
      } 
}
}

namespace BLL
{
    class GenBulkReceiptsBLL
    {
        public DataSet Get_AccountsToBeReceipted(DataSet dsImport)
        {
                  CLT.GenBulkReceipts pb = new CLT.GenBulkReceipts();
                  pb.LoadProgressBar(dsImport.Tables[0].Rows.Count); 

                  foreach (DataRow dr in dsImport.Tables[0].Rows)
            {
                          //Code cgoes here 
                  }
                  pb.ProressBarMovement();
               }
      }
  }

我将不胜感激任何帮助

非常感谢你

5 个答案:

答案 0 :(得分:4)

它不移动的原因是因为(我假设)你在同一个线程上做了所有的工作。您可能希望在单独的线程上执行此处理,例如使用BackGroundWorker

答案 1 :(得分:2)

这里有几件事。首先,将ProressBarMovement()代码移到循环中:

foreach (DataRow dr in dsImport.Tables[0].Rows) {
    //Code cgoes here 
    pb.ProressBarMovement();
}

您可能还需要强制进度条重新绘制。这就是Refresh()正在做的事情:

public void ProressBarMovement() {
    progressBar1.PerformStep();
    progressBar1.Refresh();
}

答案 2 :(得分:0)

您的应用没有响应吗?试试这个:

    public void ProressBarMovement()
    {
        progressBar1.PerformStep();
        Application.DoEvents();
    }

答案 3 :(得分:0)

您应该将进度条增量调用移动到foreach循环中,如下所示:

 foreach (DataRow dr in dsImport.Tables[0].Rows)
{
         //Code cgoes here 
         pb.ProressBarMovement();
}

这样每次处理完行时,进度条都会更新一次,显示处理行的总体进度给用户。如果你只是在最后这样做,你最终只会将进度条增加1,这将显示不准确的进度并使其看起来好像没有被移动

答案 4 :(得分:0)

这里的关键是线程。当天做一些WPF时,我遇到了同样的问题。我最后使用后台任务来更新我的UI,一旦我补充说一切顺利。

看看这个帖子,你遇到了同样的问题。 How to update GUI with backgroundworker?

此处还有微软链接,以便您可以围绕后台工作人员正在做的事情。 http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

希望这有帮助。

编辑:提供代码以帮助推动工作。

namespace CLT
{
    public partial class GenBulkReceipts : UserControl
    {
        public void ProressBarMovement()
        {
            progressBar1.PerformStep();
        }

        public void LoadProgressBar(int progressbarMax)
        {
            progressBar1.Minimum = 1;
            progressBar1.Maximum = progressbarMax;
            progressBar1.Value = 1;
            progressBar1.Step = 1;
        }

        private void btnOpen_Click(object sender, EventArgs e)
        {
            try
           {
               OpenFile();
            }
        }

        private void OpenFile()
        {
            if (dsEx1.Tables[0].Rows.Count > 0)
            {
                AccountsToBeImported = new BLLService().Get_AccountsToBeReceipted(dsEx1);
            } 
        }
}

namespace BLL
{
    class GenBulkReceiptsBLL
    {
        DataSet _dsImport;
        BackgroundWorker _backgroundWorker;
        CLT.GenBulkReceipts _pb;

        public GenBulkReceiptsBLL()
        {
            _backgroundWorker = new BackgroundWorker();
            _backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
            _backgroundWorker.OnProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
            _backgroundWorker.ReportsProgress = true;
        }

        public DataSet Get_AccountsToBeReceipted(DataSet dsImport)
        {   
            _pb = new CLT.GenBulkReceipts();
            _pb.LoadProgressBar(dsImport.Tables[0].Rows.Count);
            _dsImport = dsImport;

            _backgroundWorker.RunWorkerAsync();  
        }

        public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {           
            int p = 0;  // set your progress if appropriate
            object param = "something"; // use this to pass any additional parameter back to the UI

            foreach (DataRow dr in _dsImport.Tables[0].Rows)
            {
                _backgroundWorker.ReportProgress(p, param);
            } 
        }

        // This event handler updates the UI
        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            _pb.ProressBarMovement();
        }
    }
}