【Winform】使用BackgroundWorker控制进度条显示进度
许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单。。。看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu.com/s/1dDIxHvz
BackgroundWorker可以在代码中创建,也可以在工具箱中拖,但如果要使用,必须将其的WorkerReportsProgress属性设置为True!
这个Demo是一个复制文件的,为了效果更明显,建议复制的文件多一点,方便进度条显示。
界面如下:
下面是全部代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace Demo_ProgressBar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} string[] fileNames = null;//存储文件路径
string savePath = null;//存储保存路径 private void btnChooseFiles_Click(object sender, EventArgs e)//添加文件到listBox
{
OpenFileDialog o = new OpenFileDialog();//打开文件对话框的对象
o.Multiselect = true;//文件可以多选
o.ShowDialog();
if (o.FileNames == null)//如果没有选择文件
{
return;
}
else
{
fileNames = o.FileNames;
for (int i = ; i < fileNames.Length; i++)
{
if (!lstbxShowFiles.Items.Contains(fileNames[i]))//如果列表中不包含元素才添加
{
lstbxShowFiles.Items.Add(fileNames[i]);
}
}
}
} private void btnChooseSavePath_Click(object sender, EventArgs e)//选择保存路径
{
FolderBrowserDialog f = new FolderBrowserDialog();//选择路径
f.ShowDialog();
if (f.SelectedPath == null)
{
return;
}
else
{
txtSavePath.Text = savePath = f.SelectedPath;
}
} private void btnStart_Click(object sender, EventArgs e)//开始复制
{
prgrsbr1.Maximum = lstbxShowFiles.Items.Count;//让进度条的最大值等于列表中要复制的文件的数目
for (int i = ; i < lstbxShowFiles.Items.Count; i++)
{
using (FileStream fsRead = new FileStream(fileNames[i], FileMode.OpenOrCreate, FileAccess.Read))//读取文件流
{
using (FileStream fsWrite = new FileStream(savePath + "\\" + Path.GetFileName(fileNames[i]), FileMode.OpenOrCreate, FileAccess.Write))//写入文件流
{
byte[] buffer = new byte[];
while (fsRead.Read(buffer, , buffer.Length) != )//返回值为零表示读完
{
fsWrite.Write(buffer, , buffer.Length);
}
}
}
bckgrdwkrReport.ReportProgress(i + );//报告进度,触发ProgressChanged事件
}
prgrsbr1.Value = ;
MessageBox.Show("复制成功");
lstbxShowFiles.Items.Clear();
txtSavePath.Clear();
fileNames = null;
savePath = null;
} private void bckgrdwkrReport_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
prgrsbr1.Value = e.ProgressPercentage;//e.ProgressPercentage:ReportProgress方法传递的参数
}
}
}
主要用到BackgroundWorker是在第60行的方法。(不知道前两个方法的自行百度。。。不知using()和FileStream的自行百度)
在62行,我们让进度条的最大值等于列表中要复制的文件的数目,这样每复制完一个文件就在76行用ReportProgress方法报告进度并触发BackgroundWorker的ProgressChanged事件,通过事件的参数e.ProgressPercentage可以获取ReportProgress方法中的参数。
当然,BackgroundWorker还有其他的方法和事件,可以自己去尝试,但一般只用到ReportProgress方法和ProgressChanged事件。
【Winform】使用BackgroundWorker控制进度条显示进度的更多相关文章
- Ajax上传文件进度条显示
要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...
- 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示
尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...
- Extjs 使用fileupload插件上传文件 带进度条显示
一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...
- Qt flash_eraseall nandwrite 进度条显示擦除、烧录
/***************************************************************************** * Qt flash_eraseall n ...
- MFC读写.txt文件时进度条显示实时进度
整体实现方式:先获得文件长度,然后用每次读取的长度,计算出完成的百分比,用百分比的值设置进度条. 一.MFC进度条 Progress Control 相关函数 1. create() --创建Prog ...
- Android——音乐播放器完善——进度条显示当前播放进度,加可拖动进度条(未待解决完问题)
效果: 问题:可拖动进度条随进度条移动时,会致使音乐卡顿(待解决) xml <?xml version="1.0" encoding="utf-8"?&g ...
- Android中ProgressBar的使用-通过Handler与Message实现进度条显示
场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为 ...
- 实现winfrom进度条及进度信息提示,winfrom程序假死处理
1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...
- 实现winfrom进度条及进度信息提示
1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...
随机推荐
- [LeetCode] Intersection of Two Arrays 两个数组相交
Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...
- [LeetCode] Reverse Nodes in k-Group 每k个一组翻转链表
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
- github.com使用方法
github.com作为一个开源的代码托管平台,非常适合创建自己的代码库,也适合从别人已有项目fork自己的私有库:如果想私有托管,需要缴费使用. 创建自己代码库 在个人主页面,点击右上角+号,选择N ...
- SD卡的监听
摘要:在一般应用中,如果需要对占用空间比较大的文件操作,需要监听SD卡的状态,Android中对SD卡的监听状态操作步骤如下: 一.创建一个类继承于BroadcastReceiver public c ...
- vim
visual mode : insert : ctrl + v select line shift + i key word Esc
- java script 基础知识
方法:提供信息 函数去处理 给出一个结果 字符类型. 字符提前赋类型 int i=1; money x; float;datetime; decimal;var 万用类型 var a = 1; 1赋值 ...
- 冰冻三尺非一日之寒--js dom
1. 写页面是觉得丑 float,clear:both,margin,padding position: left: 网 ...
- 基于python的selenium自动化测试环境安装
1. Python2安装 官方网站:https://www.python.org/downloads/ (python3或新版本已经默认集成了pip包和path,安装的时候打勾就行,可以直接跳过下面第 ...
- java学习笔记之数组
- 基于redis 实现分布式锁的方案
在电商项目中,经常有秒杀这样的活动促销,在并发访问下,很容易出现上述问题.如果在库存操作上,加锁就可以避免库存卖超的问题.分布式锁使分布式系统之间同步访问共享资源的一种方式 基于redis实现分布式锁 ...