我是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();
}
}
}
我将不胜感激任何帮助
非常感谢你
答案 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();
}
}
}