我现在界面上有两个listview。在第一个listview1上我点击某一项,listview2将先清空所有项,再加载对应的项。项也比较多。这样的话,刷新的肯定很难看。所以我想弹出个框,显示进度,加载完成后,再关闭进度框到主界面。一直都没有做过这个东西,求高手指点啊。

解决方案 »

  1.   

    添加progressBar控件其maximun为你增加项的数目,每增加一个项其value加1.注意刷新
      

  2.   

    晕哦,为什么我的那个进度条的小FORM 都不出来哦。我show()了之后都不出来,太假了吧、
      

  3.   

    不是应该backgroudworker来进度条吗?
      

  4.   

    去年还是前年做的了.现成的.让用户爱上你的程序忙碌假死
    参数说明:ShowMask(指定要遮罩的控件,旋转标记的规格模式:16*16,24*24,32*32,64*64)[下载:WorkingMsk]
      

  5.   

    WorkingMSK1.A_KEY = "D";
    WorkingMSK1.SHOWMSK(ListBox1, 2);   //将某个控件遮罩起来并显示旋转的忙碌标记
    WorkingMSK1.DELEMSK(ListBox1);     //将已经遮罩的控件取消遮罩
      

  6.   


    说实话我们项目中也是用backgroundworker来做进度条,但是,MSDN上明确写着,不要再DoWork方法中控制UI。。
      

  7.   

    在赋值时progressBar.Value=i后,执行System.Windows.Forms.Application.DoEvent();
      

  8.   

    我也正困扰这个问题,你的方法解决不了他的疑惑。
    他加载项很多,而且可能有阻塞线程,这个时候会让Timer_Ticker事件无法启动,因此也看不到进度条的变化。
      

  9.   

    我现在转换了一个思路了,不让进度条循环滚动,就按进度前进,然后在每一个加载项加载成功的时候,就强行给ProgressBar.Value赋值,具体每次增加多少,根据每个加载项的大致加载时间的占比来填写。这样做确实还不能完全让我满意,但是这也是现在能想到的最好的一个效果了。
      

  10.   

     给你发个简单点的用异步委托:    //异步delegate
        private delegate int TestDelegate(int i);    private void button1_Click(object sender, EventArgs e)
        {
          TestDelegate t = Test;
          IAsyncResult i = t.BeginInvoke(5000, null, null);
          ProgressForm f = null;
          if (!i.IsCompleted)
          {
            //这个窗体上放了progressBar控件,Style属性设置为Marquee---实现来回滚动
            //这个并没有实现准确返回实际进度,只是告诉用户程序没有死掉
            //要实现准确返回实际进度也不难,只需要看一下线程,委托,跨线程调用控件的知识就可以啦
            f = new ProgressForm(); 
            f.ShowDialog();
          }      int j = t.EndInvoke(i);
          if (j > 5000)
          {
            if (f != null) 
            { 
              f.Close();
              f = null;
            }
          }
        }    private int Test(int i)
        {
          //模拟耗时操作
          Thread.Sleep(i);
          return ++i;
        }
      

  11.   

     在发一个吧
        private delegate void TestDelegate();    Form2 f2 = null;
        private void button1_Click(object sender, EventArgs e)
        {
          f2 = new Form2();
          Thread thread = new Thread(new ThreadStart(Test));
          thread.Start();
          //
          f2.ShowDialog();
        }    private void Test()
        {
          //模拟耗时操作
          Thread.Sleep(5000);
          if (f2 != null)
          {
            CloseForm();
          }
        }    private void CloseForm()
        {
          if (this.InvokeRequired)
          {
            TestDelegate t = new TestDelegate(CloseForm);
            this.Invoke(t);
          }
          else
          {
            f2.Close();
          }
        }