模态进度条

这个问题会让一些初学者感到困惑,一方面模态窗体在打开之后(Form.ShowDialog).主线程无法继续执行下面的事务;另一方面,又要在处理事务的时候来同步这个窗体里面的进度条。这两件事情都必须做,却都不能先做...

所以很多人不得不把事务处理写到模态窗体当中去,这样可以达到目的,却造成了代码结构混乱,而且子窗体无法复用,如果有多个事物,不得不为每个事务来写控制窗体。

 这里我们介绍一种比较直接了当的方法,就是主线程中开启两个子线程,一个用于显示模态窗体,一个用于处理事务, 并同时更新第一个线程中的窗体信息。

 这里的知识范畴会包含线程的基础用法,线程和UI之间的交互,以及委托的基本用法。如果你还不了解这几点,可以参考一些其他资料,比如我先前写过的,在同一窗体中用子线程来控制进度条

http://blog.csdn.net/jinjazz/archive/2008/05/06/2397136.aspx

这里的应用稍微复杂一些,你可以先用Vs2005新建一个Windows Application,这个application包含两个窗体,一个Form1,为主窗体,一个Form2,为模态子窗体。Form1,中添加Button1,用来开启测试。Form2中添加进度条ProgressBar1和一个用来取消事务的按钮Button1。然后把如下代码贴入测试程序中的两个form里面。

Form1,主窗体

 using  System;
 using  System.Windows.Forms;
 
 namespace  WindowsApplication39
  ... {
      public   partial   class  Form1 : Form
       ... {
 
          delegate   void  dShowForm();
         Form2 frm  =   new  Form2();
 
          public  Form1()
           ... {
              this .InitializeComponent();
         }
          // 显示窗体
          void  ShowForm()
           ... {
              if  ( this .InvokeRequired)
               ... {
                  this .Invoke( new  dShowForm( this .ShowForm));
             }
              else
               ... {
                 frm.ShowDialog( this );
             }
         }
          // 控制进度
          void  SetProgress()
           ... {
              for  ( int  i  =   1 ; i  <=   100 ; i ++ )
               ... {
                  if  (frm.DialogResult  ==  DialogResult.Cancel)
                   ... {
                      // 判断取消
                      break ;
                 }
                  else
                   ... {
                      // 模拟进度
                     frm.SetProgress( 100 , i);
                     System.Threading.Thread.Sleep( 50 );
                 }
             }
         }
          private   void  button1_Click( object  sender, EventArgs e)
           ... {
              new  System.Threading.Thread( new  System.Threading.ThreadStart(ShowForm)).Start();
              new  System.Threading.Thread( new  System.Threading.ThreadStart(SetProgress)).Start();
         }
     }
 }
Form2,模态窗体

 using  System;
 using  System.Windows.Forms;
 namespace  WindowsApplication39
  ... {
      public   partial   class  Form2 : Form
       ... {
          public  Form2()
           ... {
             InitializeComponent();
         }
 
          public   delegate   void  dSetProgress( int  total,  int  current);
 
          public   void  SetProgress( int  total,  int  current)
           ... {
              if  ( this .InvokeRequired)
               ... {
                  try
                   ... {
                       this .Invoke( new  dSetProgress( this .SetProgress),  new   object []  ... { total, current } );
                 }
                   catch   ... { }
             }
              else
               ... {
                  this .progressBar1.Maximum  =  total;
                  this .progressBar1.Value  =  current;
             }
         }
 
          private   void  button1_Click( object  sender, EventArgs e)
           ... {
              this .DialogResult  =  DialogResult.Cancel;
         }
     }
 }


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinjazz/archive/2008/05/24/2477088.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值