using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace Test

 

{

    
public class MyProgress

    
{

        
//by 闫磊 Email:Landgis@126.com,yanleigis@21cn.com 2007.10.30

        
private int MaxNum;

        Form progressForm
=null;

        ProgressBar progressBar1
=null;

        
bool Stop=false;

        Label label1;

        
public bool ProgressStep(int step)

        
{

            
if (Stop)

            
{

                
this.Dispose();

                
return true;

            }


            
if (progressBar1.Value > progressBar1.Maximum)

            
{

                
this.Dispose();

                
return true;

            }


            

            progressBar1.Value
+= step;

            label1.Text 
= "目前完成:" + (progressBar1.Value * 100 / progressBar1.Maximum) + "%";

            Application.DoEvents();

            

            
return false;

        }


        
private void btn_Click(object sender, EventArgs e)

        
{

            
if (MessageBox.Show("你确定终止吗""终止", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes)

            Stop 
= false;

            
else

            Stop 
= true;

        }


        
public MyProgress(int Max, String Caption, bool IsCancel)//最大值和标题

        
{

            progressForm 
= new Form();

            progressForm.MinimizeBox 
= false;

            progressForm.MaximizeBox 
= false;

            progressForm.StartPosition 
= FormStartPosition.CenterScreen;

            progressForm.Width 
= 326+19;

            progressForm.Height 
= 96+19+20;

            progressForm.Text
= Caption;

            progressForm.TopMost 
= true;//设置窗口在上边

            label1 
= new Label();

            label1.Left 
= 9;

            label1.Top 
= 15;

            label1.Parent 
= progressForm;

            progressBar1 
= new ProgressBar();

            progressBar1.Maximum 
= Max;

            MaxNum 
= Max;

            progressBar1.Left 
= 9;

            progressBar1.Top 
= 25+15;

            progressBar1.Width 
= 310;

            progressBar1.Parent 
= progressForm;

            progressBar1.Value 
= 0;

            

            
if (IsCancel)

            
{

                Button btnCancel 
= new Button();

                btnCancel.Text 
= "取消";

                btnCancel.Left 
= 240;

                btnCancel.Top 
= 54+20;

                btnCancel.Parent 
= progressForm;

                btnCancel.Click 
+= new System.EventHandler(this.btn_Click);

                

            }


            progressForm.Show();

            

        }


        
public void Dispose()

        
{

            
if (progressForm != null)

            
{

                progressBar1.Dispose();

                progressForm.Dispose();

            }


        }


    }


}


----------------------------------

//调用测试 进度条窗口

private void button2_Click(object sender, EventArgs e)

{

    MyProgress myProgress 
= new MyProgress(100"进度条"true);

    
try

    
{

        
for (int i = 0; i < 100; i++)

        
{

            
if (myProgress.ProgressStep(1)) return;

            Application.DoEvents();
//让系统在百忙中抽空刷新

            

            Thread.Sleep(
100);

        }


    }


    
finally

    
{

        myProgress.Dispose();

    }


}


//--------------------------------按高手的意思修改BackgroundWorker,如下

//使用BackgroundWorker异步进度条

using System;

using System.Collections.Generic;

using System.Text;

using System.ComponentModel;//BackgroundWorker所在的

using System.Windows.Forms;

namespace Test

{

    
class MyNewProgress

    
{

        
private BackgroundWorker backgroundWorker = null;

        
//by 闫磊Email:Landgis@126.com,yanleigis@21cn.com 2007.10.31

        
private int MaxNum;

        Form progressForm 
= null;

        ProgressBar progressBar1 
= null;

        

        Label label1;

        

        
private void btn_Click(object sender, EventArgs e)

        
{

            
if (backgroundWorker.IsBusy)

            
{

                
if (MessageBox.Show("你确定终止吗""终止", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)

                backgroundWorker.CancelAsync();

            }


        }


        
public void OnProcessCompleted(object sender, EventArgs e)

        
{

            Dispose();

        }


        

        
public void OnProgressChanged(object sender, ProgressChangedEventArgs e)

        
{

            progressBar1.Value 
= e.ProgressPercentage;

            label1.Text 
= "目前完成:" + (progressBar1.Value * 100 / progressBar1.Maximum) + "%";

        }


        
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

        
{

            
//return;

            

            
/*if (e.Cancelled)

            {

                MessageBox.Show("取消");

            }

            else if (e.Error != null)

            {

                MessageBox.Show("错误");

            }

            else

            {

                

                MessageBox.Show("完成");

            }

            
*/


        }


        
private void Form_FormClosing(object sender, FormClosingEventArgs e) //处理窗口直接关闭事件

        
{

            
if (backgroundWorker.IsBusy)

            
{

                
if (MessageBox.Show("你确定终止吗""终止", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)

                backgroundWorker.CancelAsync();

                
else

                e.Cancel 
= true;

            }


        }


        

        
//把事件传进入

        
private void SetbackgroundWorker(DoWorkEventHandler DoWork, ProgressChangedEventHandler worker_ProgressChanged)

        
{

            backgroundWorker 
= new BackgroundWorker();

            backgroundWorker.WorkerReportsProgress 
= true;//有进度条

            backgroundWorker.WorkerSupportsCancellation 
= true;//是否支持异步取消

            backgroundWorker.DoWork 
+= new DoWorkEventHandler(DoWork);

            backgroundWorker.ProgressChanged 
+= new ProgressChangedEventHandler(worker_ProgressChanged);//做的事情

            backgroundWorker.ProgressChanged 
+= new ProgressChangedEventHandler(OnProgressChanged);//更新进度条

            backgroundWorker.RunWorkerCompleted 
+= new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);//完成事件

            backgroundWorker.RunWorkerCompleted 
+= new RunWorkerCompletedEventHandler(OnProcessCompleted);

            backgroundWorker.RunWorkerAsync();

        }


        
public MyNewProgress(int Max, String Caption, bool IsCancel, DoWorkEventHandler DoWork, ProgressChangedEventHandler worker_ProgressChanged)//最大值和标题

        
{

            progressForm 
= new Form();

            progressForm.MinimizeBox 
= false;

            progressForm.MaximizeBox 
= false;

            progressForm.StartPosition 
= FormStartPosition.CenterScreen;

            progressForm.Width 
= 326 + 19;

            progressForm.Height 
= 96 + 19 + 20;

            progressForm.Text 
= Caption;

            progressForm.TopMost 
= true;//设置窗口在上边

            label1 
= new Label();

            label1.Left 
= 9;

            label1.Top 
= 15;

            label1.Parent 
= progressForm;

            progressBar1 
= new ProgressBar();

            progressBar1.Maximum 
= Max;

            MaxNum 
= Max;

            progressBar1.Left 
= 9;

            progressBar1.Top 
= 25 + 15;

            progressBar1.Width 
= 310;

            progressBar1.Parent 
= progressForm;

            progressBar1.Value 
= 0;

            

            
if (IsCancel)

            
{

                Button btnCancel 
= new Button();

                btnCancel.Text 
= "取消";

                btnCancel.Left 
= 240;

                btnCancel.Top 
= 54 + 20;

                btnCancel.Parent 
= progressForm;

                btnCancel.Click 
+= new System.EventHandler(this.btn_Click);

                

            }


            progressForm.FormClosing 
+= new System.Windows.Forms.FormClosingEventHandler(this.Form_FormClosing);

            progressForm.Show();

            SetbackgroundWorker(DoWork, worker_ProgressChanged);

            

        }


        
public void Dispose()

        
{

            
if (progressForm != null)

            
{

                progressBar1.Dispose();

                progressForm.Dispose();

            }


        }


    }


}


//测试方法,放一个按钮button和标签label1

private void worker_DoWork(object sender, DoWorkEventArgs e)

{

    DoNothing((BackgroundWorker)sender, e);

}


 

private void DoNothing(BackgroundWorker worker, DoWorkEventArgs e)

{

    
//要做的事情,写在这里

    
int num = 100;

    
for (int i = 0; i <num; i++)

    
{

        
// Check for cancellation

        
if (worker.CancellationPending)

        
{

            e.Cancel 
= true;

            
break;

        }


        
else

        
{

            worker.ReportProgress((i 
+ 1* (100 / num));

            

            Thread.Sleep(
100);

        }


    }


    

}


 

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

    label1.Text 
= e.ProgressPercentage.ToString();

    

}


private void button1_Click(object sender, EventArgs e)

{

    MyNewProgress myProgress 
= new MyNewProgress(100"进度条"true, worker_DoWork, worker_ProgressChanged);

    

}


 posted on 2007-11-30 13:31  wskfire  阅读(3164)  评论(0编辑  收藏  举报