进度条永远不会显示

B. *_*non 1 c# winforms progress-bar

我只是想要一个不确定的进度条变得可见,并显示一些"活动"来指示查询正在运行,然后,当查询通过时,返回到不可见.看似简单; 但是这个代码:

try
{
    Cursor.Current = Cursors.WaitCursor;
    progressBarChanges.Value = 50;
    progressBarChanges.Step = 20;
    progressBarChanges.Visible = true;
    ... // the meat of the code, where the query is being done, elided
} finally
{
    progressBarChanges.Visible = false;
    Cursor.Current = Cursors.Default;
}
Run Code Online (Sandbox Code Playgroud)

...进度条永远不会显示,即使查询需要一段时间才能运行.进度条位于DGV上.我意识到我的进度代码有点蹩脚,但首先要做的事情 - 我只是希望这件事能为初学者展示一些东西.

UPDATE

在我调用运行查询的BackgroundWorker proc之前,我将progressBar设置为可见方式:

progressBarChanges.Value = 50;
progressBarChanges.Step = 20;
progressBarChanges.Visible = true;
. . .    
if (args.KeyCode == Keys.Enter)
{
    if (ValidEntryForCRID(textBoxID.Text))
    {
        RetrieveAndBindPlatypusData();
        var tb = (TextBox)Controls.Find("textBoxDuckbill", true).First();
        if (tb != null)
        {
            tb.Focus(); 
        }
        if ((!string.IsNullOrWhiteSpace(textBoxID.Text)) &&
            (backgroundWorkerShowChanges.IsBusy != true))
        {
            backgroundWorkerShowChanges.RunWorkerAsync();
        }
    . . .
Run Code Online (Sandbox Code Playgroud)

...然而,progressBar永远不会变得可见(除非在DGV的DataSource被分配了返回的查询/结果集的OracleDateTable值之后,我从未将其设置回visible = false).如果我对此发表评论,那么(姗姗来迟)最终会出现,显然是在思考(错误地)"迟到总比没有好".

有没有办法迫使Windows"注意""progressBarChanges.Visible = true;" 马上就行?像.ProcessMessages()或this.Refresh或...... ???

Jus*_*ony 7

发生这种情况是因为您没有给UI线程更新时间.您正在更新为可见并立即运行您的代码.代码应该在后台线程上运行并发送更新消息.

详细说明:

设置Visible属性时,UI线程实际上不会更新,直到当前逻辑结束.那么,发生的事情是这样的:

  • 可见
  • 运行过程
  • 不可见
  • 代码已完成,因此UI已解冻并更新...最后一个状态为"不可见"

你想要的是:

  • 可见
  • 启动新线程来运行肉类
  • UI代码已完成,因此UI已解冻并将栏更新为Visible

然后这个:

  • ==>新线程运行肉类发送更新到UI线程,以便进度条可以更新

然后这个:

  • 新线程结束并在其最终方法中设置不可见
  • UI代码已完成,因此UI已解冻并将栏更新为"不可见"

使用TaskBackgroundworker应该很容易实现.

更新代码以显示常量滚动

我相信你只是错过了进度条的风格ProgressBarStyle.Marquee.如果您已经将工作卸载到后台工作者,那么剩下的就应该工作了

    public Form1()
    {
        InitializeComponent();
        this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
        this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
        progressBar1.Enabled = progressBar1.Visible = false;
        progressBar1.Style = ProgressBarStyle.Marquee;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        progressBar1.Visible = true;
        progressBar1.Enabled = true;
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Threading.Thread.Sleep(10000);
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressBar1.Visible = progressBar1.Enabled = false;
    }
Run Code Online (Sandbox Code Playgroud)