winform 窗体导入文件时,增加进度条显示问题 80
有一个导入文件的窗体,当点击按钮进行文件导入时,因为文件比较多需要等待,就要增加一个有进度条的小窗体提示用户等待。进度条界面还有个按钮,【停止导入】,点击时要停止文件导入...
有一个导入文件的窗体,当点击按钮进行文件导入时,因为文件比较多需要等待,就要增加一个有进度条的小窗体提示用户等待。进度条界面还有个按钮,【停止导入】,点击时要停止文件导入。并且进度条要时时显示导入文件的个数和百分比。本人菜鸟,还不大熟练线程进程使用。求高手具体代码。感激不尽~~~
展开
1个回答
展开全部
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( );
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询