winform 窗体导入文件时,增加进度条显示问题 80

有一个导入文件的窗体,当点击按钮进行文件导入时,因为文件比较多需要等待,就要增加一个有进度条的小窗体提示用户等待。进度条界面还有个按钮,【停止导入】,点击时要停止文件导入... 有一个导入文件的窗体,当点击按钮进行文件导入时,因为文件比较多需要等待,就要增加一个有进度条的小窗体提示用户等待。进度条界面还有个按钮,【停止导入】,点击时要停止文件导入。并且进度条要时时显示导入文件的个数和百分比。本人菜鸟,还不大熟练线程进程使用。求高手具体代码。感激不尽~~~ 展开
 我来答
freeeeeewind
2014-10-19 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1352万
展开全部

1)在Form1上布置一个PorgressBar,名称progressBar1
2)在Form1上布置一个Button,名称:button1, Text:导入
3)在Form1上布置一个Button,名称:button2, Text:取消导入
4)在Form1上布置一个BackgroundWorker,名称:backgroundWorker1

5)在Form1上布置一个Label,名称:label1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WinFormBackgroundWorker
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //设置 backgroundWorker1
            //允许报告后台处理进度
            backgroundWorker1.WorkerReportsProgress = true;
            //运行取消后台执行
            backgroundWorker1.WorkerSupportsCancellation = true;
            //事件
            backgroundWorker1.DoWork += backgroundWorker1_DoWork;
            backgroundWorker1.RunWorkerCompleted += 
                backgroundWorker1_RunWorkerCompleted;
            backgroundWorker1.ProgressChanged += 
                backgroundWorker1_ProgressChanged;
            //progressBar1
            progressBar1.Maximum = 100;
            //按钮
            button1.Enabled = true;
            button2.Enabled = false;
            //lable1
            label1.Text=string.Empty;
        }

        void backgroundWorker1_ProgressChanged(object sender, 
            ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            label1.Text = (string)e.UserState;
        }

        void backgroundWorker1_RunWorkerCompleted(object sender, 
            RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                label1.Text = "任务取消!";
                progressBar1.Value = 0;
            }
            else
            {
                label1.Text = "任务完成!";
            }
            button1.Enabled = true;
            button2.Enabled = false;
        }

        void backgroundWorker1_DoWork(object sender, 
            DoWorkEventArgs e)
        {
            //获取文件夹中文件信息
            string[] files = Directory.GetFiles(@".");
            int i = 0;
            foreach (var fs in files)
            {
                // 如果后台操作处理过程中,用户按下取消键
                if (backgroundWorker1.CancellationPending)
                {
                    //停止后台处理
                    e.Cancel = true;
                    break;
                }
                
                i++;
                string msg = "正在处理:" + fs;
                backgroundWorker1.ReportProgress(i *100 /files.Length, msg);
                //用一个Sleeep,模拟处理文件的长耗时过程
                System.Threading.Thread.Sleep(2000);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            button2.Enabled = true;
            //异步启动后台任务(多线程方式)
            backgroundWorker1.RunWorkerAsync();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //取消后台操作执行
            backgroundWorker1.CancelAsync();
        }
    }
}

 

更多追问追答
追问
我导入文件的操作不是在这个窗体,在主窗体点击导入,弹出这个窗体,这个只做提示和取消导入用。那写在backgroundWorker1_DoWork的代码该如何弄呢?
追答

假设你的主窗体为Form1,弹出的窗体为Form2,在Form2中执行文件导入操作

1)将上面在Form1中代码和控件,移动到Form2中

2)在Form2中增加一个方法,如下:

public partial class Form2 : Form
{
    ……
    public void StartFileImport()
    {
        //产生button1的 Click 事件,启动导入操作
        button1.PerformClick( );
    }
    ……

3)在Form1(主窗体)中,点击按钮button1 显示Form2并启动文件导入操作

 private void button1_Click(object sender, EventArgs e)
 {
     Form2 f2 = new Form2();
     f2.Show( );
     //启动文件导入操作
     f2.StartFileImport( );
 }
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式