当前位置: 代码迷 >> C# >> c# 进度条的有关问题
  详细解决方案

c# 进度条的有关问题

热度:243   发布时间:2016-05-05 05:22:12.0
c# 进度条的问题

public void ProgressBarValueA(string StrState, short nValue)//是用回调函数接收的数据,在这里处理的
        {
            nValue = nValue > (short)this.probA.Maximum ? (short)this.probA.Maximum : nValue;
                this.probA.Value = nValue;
                this.labState.Text = StrState;
        }



测试环境1:win8  hp6300
 现象:当nValue=100时,进度条无法充满
测试环境2:win7   hp pro3335
现象:当nValue=100时,进度条可以充满
测试环境2:win7  hp6300
现象:当nValue=100时,进度条无法充满

用的是同一个打包好的程序测试程序




------解决思路----------------------
检查一下probA.Maximum到底是多少
测试
this.probA.Value=100;
看到底显示成什么样子
------解决思路----------------------
学习一下下下
------解决思路----------------------
你试试这样:
你已知最大/最小值,那么设置好Step属性(默认是10),然后上面代码修改为:progressBar1.PerformStep();
看看问题是不是就解决了?

嘿嘿,我看到你提到了一个关键点://是用回调函数接收的数据,在这里处理的
说明你是用到了线程的意思?而回调这东西是不保证执行顺序了,另外,你的这个事件还是使用Value来修改进度条的进度,想想这逻辑就可能隐藏一个坑。
      线程A               线程B
回调设置90      
     .....                  回调设置100
     .....                      设置100
     设置90 
最终结果就是90
------解决思路----------------------
引用:
Quote: 引用:

public void ProgressBarValueA(string StrState, short nValue)//是用回调函数接收的数据,在这里处理的        

           nValue = nValue > (short)this.probA.Maximum ? (short)this.probA.Maximum : nValue;
           this.probA.Value = nValue; 
           this.labState.Text = nValue + " / " + this.probA.Maximum ;       
 }
改成这样试试看先,运行到最后是不是nValue跟Maximum是一样的,并且进度条没有充满。

如果是一样的,你看看是不是因为系统不同,导致窗体样式被改变,你的进度条的布局错了。



经测试,数据完整,当我用panel代替进度条控件时(将panel分成100份,用GDI+绘制),显示可以充满


引用:
Quote: 引用:

public void ProgressBarValueA(string StrState, short nValue)//是用回调函数接收的数据,在这里处理的        

           nValue = nValue > (short)this.probA.Maximum ? (short)this.probA.Maximum : nValue;
           this.probA.Value = nValue; 
           this.labState.Text = nValue + " / " + this.probA.Maximum ;       
 }
改成这样试试看先,运行到最后是不是nValue跟Maximum是一样的,并且进度条没有充满。

如果是一样的,你看看是不是因为系统不同,导致窗体样式被改变,你的进度条的布局错了。



经测试,数据完整,当我用panel代替进度条控件时(将panel分成100份,用GDI+绘制),显示可以充满

这个问题曾经碰到过,不同系统下,样式显示的有差异
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

“当nValue=100时,进度条无法充满”
你确定nValue确实是100吗,你测试了吗?不要靠猜想.

如果你真的完全确定你自己代码什么问题都没有,就是进度条的问题,还来问什么,直接报告微软vs有个bug,不就得了


确定,进度值就显示在进度条上方

那么恭喜你,可以向微软报告一个bug,等着收钱吧



在form窗体上放一个button 一个 ProgressBar  外加一个timer
代码如下

  int nProgressBarValue = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            nProgressBarValue++;
            nProgressBarValue = nProgressBarValue > 100 ? 0 : nProgressBarValue;
           
            this.progressBar1.Value = nProgressBarValue;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.timer1.Enabled = true;
        }

测试结果如题所述



我用这段代码,在我电脑上测试了,进度条是不满,最后有一段显示空白,大约10%左右。(Win 7 SP1 旗舰版 联想品牌机)
然后我又测试了一下,将timer1的时间段改成1000,就正常了。
我又测试了一下,将timer1的时间段改成10,空白大约会有近20%了。
看来和timer的时间段有关,猜测是时间段太短了,显示跟不上,进度条就显示不满。至于显示是满的,说不定是哪里设定的不一样(如系统高级选项中调整成最佳外观或最佳性能),或是显卡、显示器等原因。
我做了极端的测试,在最佳外观下,进度条显示不满,而调整成最佳性能,Win7就变成早期windows的那种丑效果,进度条显示就是满的了。
  相关解决方案