private void button1_Click(object sender, EventArgs e)
        {
        
            label1.Text = "正在打开数据库......";//1
            remote.con_open();
            label1.Text = "正在取数据库表";//2
            progressBar1.Value = 30;
            MyDS_Grid = remote.getDataSet("借还表", "select *from 借还表");
            dataGrid1.DataSource = MyDS_Grid.Tables[0];//上面两句是把数据显示到datagrid中
            label1.Text = "将要据库表......";//3
            progressBar1.Value = 80;
            remote.con_close();
           progressBar1.Value = 100;
            label1.Text = "关闭据库表";//4
          //  if (remote.Pull("Users", "select *from Users")) { MessageBox.Show("下载成功"); }
            //else { MessageBox.Show("下载失败"); }
        }问题是为什么一个lable的显示值不是一步一步来的(也就是不是从1,2,3,4那样显示) 。而是直接显示出最后一步“关闭据库表”。。求解答

解决方案 »

  1.   

    因为这些都是在服务端操作,你操作了,你按你的步骤操作了,操作到最后,然后把最后的结果以HTML的形式发回给客户端。所以最后是“关闭据库表”
      

  2.   

    因为这些都是在服务端操作,电脑操作了,电脑按你的步骤操作了,操作到最后,然后把最后的结果以HTML的形式发回给客户端。所以最后是“关闭据库表”
      

  3.   

    没有啊。我就一个Form 啊,,,,,Form里面就只有ProgressBar  lable  button datagrid 
      

  4.   

    不是 。那个原因!!我这个是在WIN CE里面用的 。打开数据库和  查表 都是相当慢的事情不可能很快的 因此不是那个原因
    换句话说 我要是 在里面加个
     Thread.sleep(1000);的话  它就非得等到1000之后 才会去真正做 按钮事件
      

  5.   

    这是因为是线程问题。
    你在显示之前加上Application.DoEvents();
    就可以显示出来了。private void button1_Click(object sender, EventArgs e)
            {
            
                ShowMessage( "正在打开数据库......");//1
                remote.con_open();
                ShowMessage( "正在取数据库表");//2
                progressBar1.Value = 30;
                MyDS_Grid = remote.getDataSet("借还表", "select *from 借还表");
                dataGrid1.DataSource = MyDS_Grid.Tables[0];//上面两句是把数据显示到datagrid中
                label1.Text = "将要据库表......";//3
                progressBar1.Value = 80;
                remote.con_close();
               progressBar1.Value = 100;
                ShowMessage( "关闭据库表");//4
              //  if (remote.Pull("Users", "select *from Users")) { MessageBox.Show("下载成功"); }
                //else { MessageBox.Show("下载失败"); }
            }Private void ShowMessage(string msg)
    {
        Application.DoEvnents();
        label1.Text =msg;
    }
    有一部代码没改完,自己看一下效果吧。希望可以帮到你。
      

  6.   

    在你要让用户界面刷新的地方插入代码:Application.DoEvnents();例如:
    label1.Text = "正在取数据库表";//2
    progressBar1.Value = 30;
    这样修改后,用户界面并未刷新,因为你没给它时间刷新,应用程序赶着执行下面的过程呢,所以你这时插入
    Application.DoEvnents();
    用户界面就会先刷新刚才的改变,然后再执行下面的过程。
      

  7.   

             private void ShowMess(string str,int i)
            {
                
             // Application.DoEvents();            label1.Text = str;            progressBar1.Value = i;
                Application.DoEvents();
            }这样写效果更好一些 但是并没有达到我想要的效果,有一种思路  但是写不出代码思路:首先,新起一个线程,用于更新你的进度条,不然你的界面会卡死。然后在初始化方法里设置一些标志位,然后起个timer,循环检测,每当一个标志位到达的时候,更新一下你的进度条。比如说你设置了5个标志位,那么你的进度条就分5步走,在进度条的属性里可以设置。
    写一个公用的进度条更新函数
    void UpdateProBar(int flag),把标志位送进去。调用progreesbar的update函数更新
      

  8.   

    To楼上:用多线程是对的,但是不是你所想的那样,把你button1_Click中的代码先封装到一个函数中,然后对那个函数创建委托,调用委托的BeginInvoke方法开启线程执行,遇到要回显的部分,回调显示。