问题如下:
因为在窗体初始化时,需要连接服务器获得相应信息填充在Form上,所以打开窗体的过程就显得比较漫长,大家知道如果这样的话,客户在等待的过程中会不舒服,因为没有相应的提示信息告诉它要等待服务器回馈信息。
基于这个原因,我想这样做:能不能先显示窗口,然后再向服务器发送信息,同时在窗口中添加StatusStrip控件,显示当前状态(比如说我先向服务器发送获得客户的订购信息,这时StatusStrip显示状态是:获得订购信息;接着我再向服务器发送获得客户的购买订单,此时StatusStrip显示状态:获得购买订单)。这样的话界面就显得比较人性化一点。我不清楚的是:如果先显示窗口的界面,那么向服务器发送信息的函数应该写在哪?然后就是如何让StatusStrip控件根据loading事情的不同而变换状态。我之前没用过c#Winform开发,所以不太清楚细节。请高手们赐教!!谢谢!!!!
本人结贴率很高的!!

解决方案 »

  1.   

    利用多线程来填充
    参考下面填充DataGridView的public delegate void myDelegate();
      DataTable dt;  private void btnDianJia_Click(object sender, System.EventArgs e)
      {
      try
      {
        mythread = new Thread(new ThreadStart(ThreadWork));
        mythread.Start();    
      }
      catch(System.Exception ex)
      {
        MessageBox.Show(this,ex.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
      }  
      }  void ThreadWork()
      {
      this.dataGridDJ.CaptionText="正在查询电价数据...";
      mf.statusBarPanel1.Text="正在查询电价数据...";
      this.Cursor=Cursors.WaitCursor;
      string shijian=this.dateTimeDianJia.DateValue;
      DateTime today=DateTime.Today;
      string mingcheng=this.txtMingCheng.Text;
      string leibie=this.cmbBoxLiebie_DJ.SelectedValue.ToString();
      PowerWeb.BLL.DianFeiDianJia.DianJia dj=new PowerWeb.BLL.DianFeiDianJia.DianJia();  if(shijian==today.ToString("yyyyMM"))
      {
        dt=dj.GetList(leibie,mingcheng).Tables[0];
      }
      else
      {
        dt=dj.GetListOld(leibie,mingcheng,shijian).Tables[0];
      }
      this.dataGridDJ.CaptionText=shijian+"电价信息 (共计条"+dt.Rows.Count.ToString()+"记录)";  dataGridDJ.BeginInvoke(new myDelegate(FillData));//异步调用(来填充)
      
      this.Cursor=Cursors.Default;
      mf.statusBarPanel1.Text="查询结束";
      }
      
      private void FillData()
      {
      this.dataGridDJ.DataSource=dt.DefaultView;
      }
      

  2.   

    用BackgroudWorker,下面是简单的例子
    具体细节根据实际应用做修改        BackgroundWorker bgworker = new BackgroundWorker();
            public Form1()
            {
                InitializeComponent();
            }        protected override void OnLoad(EventArgs e)
            {
                bgworker = new BackgroundWorker();
                bgworker.DoWork += (bgworker_DoWork);
                bgworker.ProgressChanged += (bgworker_ProgressChanged);
                bgworker.WorkerReportsProgress = true;
                bgworker.RunWorkerAsync();
            }        void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.statusStrip1.Text = e.UserState.ToString();
            }        void bgworker_DoWork(object sender, DoWorkEventArgs e)
            {
                
                BackgroundWorker worker = sender as BackgroundWorker;
                //获得订购信息
                worker.ReportProgress(50, "获得订购信息");
                //todo:GetOrderInfo();            //调试用,可有可无
                Thread.Sleep(1000);
                //获得购买订单
                worker.ReportProgress(100, "获得购买订单");
                //todo:GetOrderList();        }
      

  3.   

     protected override void OnLoad(EventArgs e)
     换成
      protected override void OnShown(EventArgs e)
      

  4.   

    忘了一点...,你要自己先往StatusStrip上加几个ToolStripStatusLabel;
            void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.toolStripStatusLabel1.Text = e.UserState.ToString();
            }
      

  5.   

    我用了你的方法:使用BackgroundWorker 类,但窗体显示的时候就进入阻塞状态,一直到信息都load玩,才正常显示。
    这样的话跟原先就没什么区别,因为虽然可以看到窗体,但窗体上的控件都是阻塞的(相当于窗体是空白的)。不知道怎么解决?
    谢谢!!
      

  6.   

    我把代码贴一下,请各位大侠帮一忙:
     public partial class FormMain : Form
        {
            BackgroundWorker bgworker = new BackgroundWorker();
            public FormMain()
            {
                InitializeComponent();
                ConfigInterface();
                comboBoxMsgType.Items.Add("StandardMailing");
                comboBoxMsgType.Items.Add("ApprovalMailing");
                comboBoxMsgType.Items.Add("NotificatedTriggerMailing");
                comboBoxMsgType.Items.Add("RecurringTriggerMailing");
                comboBoxMsgType.SelectedIndex = 0;
                comboBox2.Items.Add("None");
                comboBox2.SelectedIndex = 0;
            }
             protected override void OnLoad(EventArgs e)
            {
                bgworker = new BackgroundWorker();
                bgworker.DoWork += new DoWorkEventHandler(bgworker_DoWork);
                bgworker.ProgressChanged += new ProgressChangedEventHandler(bgworker_ProgressChanged);
                bgworker.WorkerReportsProgress = true;
                bgworker.RunWorkerAsync();
            }
     void bgworker_DoWork(object sender, DoWorkEventArgs e)
            {
                BeginInvoke(new MethodInvoker(LoadUserInfo));
            }
    private void LoadUserInfo()
            {            try
                {
                    this.timer1.Enabled = true;
                    this.toolStripProgressBar1.Style = ProgressBarStyle.Marquee;
                    LoadInfomation[color=#FF0000]....;//这里是Load界面上控件值的代码,因为比较长而且代码运行时间场,所以没贴。[/color]            }
                catch (Exception Ex)
                {
                    MessageBox.Show("ClientName Error:" + Ex.Message);
                }
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                if (toolStripProgressBar1.Value == toolStripProgressBar1.Maximum)
                {
                    toolStripProgressBar1.Value = 0;
                }
                else if (toolStripProgressBar1.Value == 3)
                {
                    toolStripStatusLabelInfo.Text = "Loading Site Infomation";
                    toolStripProgressBar1.PerformStep();
                }
                else if (toolStripProgressBar1.Value == 8)
                {
                    toolStripStatusLabelInfo.Text = "Loading List Infomation";
                    toolStripProgressBar1.PerformStep();
                }
                else if (toolStripProgressBar1.Value == 18)
                {
                    toolStripStatusLabelInfo.Text = "Loading Campaign Infomation";
                    toolStripProgressBar1.PerformStep();
                }
                else if (toolStripProgressBar1.Value == 28)
                {
                    toolStripStatusLabelInfo.Text = "Loading Message Infomation";
                    toolStripProgressBar1.PerformStep();
                }
                else
                {
                    //toolStripStatusLabelInfo.Text = "Loading Site Infomation";
                    toolStripProgressBar1.PerformStep();
                }
            }
    }
    出现的问题是:1.窗体打开后,会进入假死状态,我不是很清楚为什么会出现这种状态。等到Load信息完后,界面会恢复正常
    2.我想让进度条toolStripProgressBar1随计时器时间的不同显示不同的值,可是它却丝毫不动。谢谢大家!!!
      

  7.   

    完整代码
    不知道为什么要用Timer??
    事件处理放到OnShown里,不是OnLoad       public partial class Form1 : Form
        {
            BackgroundWorker bgworker;
            public Form1()
            {
                InitializeComponent();
            }
            protected override void OnShown(EventArgs e)
            {
                bgworker = new BackgroundWorker();
                bgworker.DoWork += (bgworker_DoWork);
                bgworker.ProgressChanged += (bgworker_ProgressChanged);
                bgworker.WorkerReportsProgress = true;
                bgworker.RunWorkerAsync();
            }        void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.toolStripStatusLabel1.Text = e.UserState.ToString();
            }
            void bgworker_DoWork(object sender, DoWorkEventArgs e)
            {   
                BackgroundWorker worker = sender as BackgroundWorker;
                worker.ReportProgress(20, "获得订购信息");
                Thread.Sleep(2000);
                worker.ReportProgress(40, "获得购买订单");
                Thread.Sleep(2000);
                worker.ReportProgress(80, "获得购买订单11111");
                Thread.Sleep(2000);
                worker.ReportProgress(100, "获得购买订单22222");
            }
        }
      

  8.   

    "Loading Site Infomation";
    "Loading List Infomation";
    "Loading Campaign Infomation";
    "Loading Message Infomation";这些步骤,全部放到DoWork里去完成,如果你的ProgressBar要显示进度,那就在ProgressChanged去刷新
      

  9.   

    因为这个窗体是主启动窗体,所以把代码写到Onshown中不起作用
      

  10.   

    现在先不管进度条,就是希望当Run一个窗体时,怎么样防止窗体陷入假死状态,因为这样给客户的感觉很不好。
    我采用bloodish的建议使用BackgroundWorker类,但还会陷入假死状态。
    由于这个窗体是程序的主窗体,所以在OnShown里面写好像不起作用谢谢大家
      

  11.   

    问一下:我想在一个label上显示时钟功能,显示格式:YYYY MM dd hh:mm:ss,主要是它的时间要跟随系统时间而变化谢谢
      

  12.   

    时间:timer控件的Tick事件
     private void timer1_Tick(object sender, EventArgs e)
     {
        label1.Text = DateTime.Now.ToString();
     }
      

  13.   

    第一步:
    在窗体的load事件中:
     DateTime DQDate = DateTime.Now.Date;
    string DQTime = DateTime.Now.ToShortTimeString();
    this.toolSDLtime.Text = DQDate.ToShortDateString() + "  " + DQTime;     toolSDQTime.Text = DQTime;
    timer1.Interval = 10000;
    timer1.Tick += new EventHandler(timer1_Tick);
    timer1.Start();
    第二步:
    在timer控件的事件中:
     private void timer1_Tick(object sender, EventArgs e)
            {
                timer1.Enabled = true;            
                string DQTime = DateTime.Now.ToShortTimeString ();
                toolSDQTime.Text =  DQTime;
            }   
      lable控件的text属性会随着时间的改变而改变;还有一点:“将timer控件的Interval属性设为你要改变的时间间隔例如一分钟变一次该属性值为60000”