none
c# winform TabControl添加TabPage很慢,需要显示等待提示,以增加用户体验! RRS feed

  • 问题

  • c# winform TabControl添加TabPage很慢,因为TabPage添加了一个用户控件,而用户控件加载了很多东东,导致界面有点延迟,影响用户使用,我想在加载的时候弹出一个等待提示,是否有好的办法?
    www.shshunfu.com
    2011年8月16日 3:01

答案

  •  

     public partial class WaitForm : Form
      {
        public string sValue = "加载数据 请稍等.......";
        private Cursor currentCursor;
        private Form FatherForm;
    
        public WaitForm()
        {
          //InitializeComponent();
          this.FormBorderStyle = FormBorderStyle.FixedDialog;
          this.StartPosition = FormStartPosition.CenterScreen;
          this.ClientSize = new Size(220, 40);
          this.ControlBox = false;
          this.ShowInTaskbar = false;
          this.TopMost = true;
          this.Paint += new PaintEventHandler(WaitDialogPaint);
        }
    
       
        public void Show(string sValue)
        {
          this.sValue = sValue;
          this.Show();
    
        }
        public void Show()
        {
          currentCursor = Cursor.Current;
          Cursor.Current = Cursors.WaitCursor;
          base.Show();
          this.Refresh();
        }
        public void Refresh(string sValue)
        {
          this.sValue = sValue;
          this.Refresh();
        }
        public void Close()
        {
          Cursor.Current = currentCursor;
          base.Close();
        }
        private void WaitDialogPaint(object sender, PaintEventArgs e)
        {
          Rectangle r = e.ClipRectangle;
          r.Inflate(-1, -1);
          StringFormat sf = new StringFormat();
          sf.Alignment = StringAlignment.Center;
          sf.LineAlignment = StringAlignment.Center;
          ControlPaint.DrawBorder3D(e.Graphics, r, Border3DStyle.RaisedInner);
          e.Graphics.DrawString(sValue, new Font("Arial", 9, FontStyle.Regular), SystemBrushes.WindowText, r, sf);
        }
      }
    

     

    DEMO

    http://blog.csdn.net/zx13525079024/article/details/6698014


    http://blog.csdn.net/zx13525079024
    2011年8月18日 5:49
  • 你还可以将ProgressBar放到另外一个Form上,并设置Style为ProgressBarStyle.Marquee。

    让后在你将一个新的TabPage加入TabControl的时候,启动一个新线程来显示上面那个Form来显示ProgressBar,让终端用户知道正在进行新的TabPage显示的过程,当TabPage加入了TabControl之后关闭上面的Form来提示用户显示过程已完成。

    https://skydrive.live.com/embedicon.aspx/2011/2011Y08M/ProgressAndTab.zip?cid=bb789f72272d4858

    这个小例子演示了我的思路,你可以下载并测试它。

        Form2 f2;  
        private void button1_Click(object sender, EventArgs e)
        {
          f2 = new Form2();
          f2.Show();
    
          Func<TabPage, int> addpage = delegate(TabPage tabpage)
          {
            this.tabControl1.TabPages.Add(tabpage);
            return 1;
          };
    
          Func<Form, int> closeForm = delegate(Form form)
          {
            form.Close();
            return 1;
          };
    
          Thread thread = new Thread(delegate()
            {
              TabPage tabPage3 = new TabPage();
              Thread.Sleep(5000);
              
              if (this.tabControl1.InvokeRequired)
              {
                this.tabControl1.Invoke(addpage, tabPage3);
              }
              else 
              {
                this.tabControl1.TabPages.Add(tabPage3);
              }
    
              if (f2.InvokeRequired)
              {
                f2.Invoke(closeForm, f2);
              }
              else
              {
                f2.Close();
              }
            });
          thread.Start();
        }
    

    这是核心部分的代码。

    其中用到了多线程处理,你可以查看这篇文档:http://msdn.microsoft.com/zh-cn/library/ms171728.aspx

     


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月18日 6:54
    版主

全部回复

  • 注:是在TabPage页里显示提示
    www.shshunfu.com
    2011年8月16日 3:02
  •  

     public partial class WaitForm : Form
      {
        public string sValue = "加载数据 请稍等.......";
        private Cursor currentCursor;
        private Form FatherForm;
    
        public WaitForm()
        {
          //InitializeComponent();
          this.FormBorderStyle = FormBorderStyle.FixedDialog;
          this.StartPosition = FormStartPosition.CenterScreen;
          this.ClientSize = new Size(220, 40);
          this.ControlBox = false;
          this.ShowInTaskbar = false;
          this.TopMost = true;
          this.Paint += new PaintEventHandler(WaitDialogPaint);
        }
    
       
        public void Show(string sValue)
        {
          this.sValue = sValue;
          this.Show();
    
        }
        public void Show()
        {
          currentCursor = Cursor.Current;
          Cursor.Current = Cursors.WaitCursor;
          base.Show();
          this.Refresh();
        }
        public void Refresh(string sValue)
        {
          this.sValue = sValue;
          this.Refresh();
        }
        public void Close()
        {
          Cursor.Current = currentCursor;
          base.Close();
        }
        private void WaitDialogPaint(object sender, PaintEventArgs e)
        {
          Rectangle r = e.ClipRectangle;
          r.Inflate(-1, -1);
          StringFormat sf = new StringFormat();
          sf.Alignment = StringAlignment.Center;
          sf.LineAlignment = StringAlignment.Center;
          ControlPaint.DrawBorder3D(e.Graphics, r, Border3DStyle.RaisedInner);
          e.Graphics.DrawString(sValue, new Font("Arial", 9, FontStyle.Regular), SystemBrushes.WindowText, r, sf);
        }
      }
    

     

    DEMO

    http://blog.csdn.net/zx13525079024/article/details/6698014


    http://blog.csdn.net/zx13525079024
    2011年8月18日 5:49
  • 你还可以将ProgressBar放到另外一个Form上,并设置Style为ProgressBarStyle.Marquee。

    让后在你将一个新的TabPage加入TabControl的时候,启动一个新线程来显示上面那个Form来显示ProgressBar,让终端用户知道正在进行新的TabPage显示的过程,当TabPage加入了TabControl之后关闭上面的Form来提示用户显示过程已完成。

    https://skydrive.live.com/embedicon.aspx/2011/2011Y08M/ProgressAndTab.zip?cid=bb789f72272d4858

    这个小例子演示了我的思路,你可以下载并测试它。

        Form2 f2;  
        private void button1_Click(object sender, EventArgs e)
        {
          f2 = new Form2();
          f2.Show();
    
          Func<TabPage, int> addpage = delegate(TabPage tabpage)
          {
            this.tabControl1.TabPages.Add(tabpage);
            return 1;
          };
    
          Func<Form, int> closeForm = delegate(Form form)
          {
            form.Close();
            return 1;
          };
    
          Thread thread = new Thread(delegate()
            {
              TabPage tabPage3 = new TabPage();
              Thread.Sleep(5000);
              
              if (this.tabControl1.InvokeRequired)
              {
                this.tabControl1.Invoke(addpage, tabPage3);
              }
              else 
              {
                this.tabControl1.TabPages.Add(tabPage3);
              }
    
              if (f2.InvokeRequired)
              {
                f2.Invoke(closeForm, f2);
              }
              else
              {
                f2.Close();
              }
            });
          thread.Start();
        }
    

    这是核心部分的代码。

    其中用到了多线程处理,你可以查看这篇文档:http://msdn.microsoft.com/zh-cn/library/ms171728.aspx

     


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月18日 6:54
    版主
  • Thanks all!
    www.shshunfu.com
    2011年8月25日 2:34
  • You're welcome!
    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月25日 5:22
    版主