我做了一个登陆界面,连接远程数据库验证信息,但是由于是远程比较慢,想弹出一个等待窗口,该窗口显示“正在登陆,请稍后....”但是登陆button的事件里如下的代码,wait窗口里面死活label的东西都显示不出来,只显示了背景色,我加个button都显示不出来,求解释....
private void button1_Click(object sender, EventArgs e)
        {
            wait wt = new wait();
            wt.Show();

            string user = textBox1.Text.Trim();
            string sql = "select * from userinfo where code= '" + user + "'";
            DataSet ds = DB.getdatasetbysql(sql);            //this.dataGrid1.DataSource = ds.Tables["table1"];
            if (ds.Tables[0].Rows.Count == 0)
            {
                MessageBox.Show("用户名不存在", "错误", MessageBoxButtons.OK);
            }
            else if (ds.Tables[0].Rows[0]["password"].ToString() == textBox2.Text.Trim())
            {
                userid = ds.Tables[0].Rows[0]["id"].ToString();
                DateTime dt = DateTime.Now;
                Form2 fr = new Form2(userid, dt);
                fr.Show();
            }
            else
            {
                MessageBox.Show("密码错误", "错误", MessageBoxButtons.OK);
            }
            wt.Hide();
        }

解决方案 »

  1.   

    wait窗体 与验证部分要使用不同线程,不然就被阻塞了。
    可以将验证部分单独设置一个后台线程,完成后返回callback,将wait窗体关掉。
      

  2.   

    实现方法很多,仅模拟个思路给你们  ManuResetEvent _VEvent= new ManuResetEvent(false);
     
    private void button1_Click(object sender, EventArgs e)
      {
        wait wt = new wait();
       wt.Show();
       Thread p =new Thread(new TheadStart(VFunc))
       p.Start();
       _VEvent.WaitOne();    //这样做仅是便于理解,但更好的方式是是使用异步模式的CallBack()
       wt.Hide();
      }
      
      private void VFunc()
      {
        ....        
     //需要注意的是,在单独的线程中启动form,貌似只好用ShowDialog,但其输入框的切换中文输入有些问题,因此最好在主线程使用Show。
        _VEvent.Set();
      }