• c#中如何控制模态子窗体中的进度条


     这个问题会让一些初学者感到困惑,一方面模态窗体在打开之后(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;
            }

        }

    }

  • 相关阅读:
    Codeforces Round #297 (Div. 2)D. Arthur and Walls 暴力搜索
    Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心
    Codeforces Round #297 (Div. 2)B. Pasha and String 前缀和
    Codeforces Round #297 (Div. 2)A. Vitaliy and Pie 水题
    BZOJ 1191: [HNOI2006]超级英雄Hero 匈牙利算法
    Codeforces Round VK Cup 2015
    Codeforces Round #296 (Div. 1) C. Data Center Drama 欧拉回路
    BZOJ 1059: [ZJOI2007]矩阵游戏 匈牙利算法
    UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP
    Hibernate自定义字段查询
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6204938.html
Copyright © 2020-2023  润新知