当前位置: 首页 > article >正文

c#进度条实现方法

在使用c#做WinFrom开发时,经常会用到进度条(ProgressBar)。那么如何才能实现winfrom进度条及进度信息提示呢?

方法一:多线程

使用c#做WinFrom开发,要实现进度条效果就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息)

1、设计界面
需要引用 using System.Threading;

在这里插入图片描述

控件名称分别为:progressBar1;label1;textBox1;button1;

2、定义一个代理
代理用于更新ProgressBar的值(Value)及在执行方法的时候,返回方法的处理信息。

private delegate void SetPos(int ipos,string vinfo);//代理

3、设置进度条更新函数
进度条值更新函数(参数必须跟声明的代理参数一样)

private void SetTextMesssage(int ipos,string vinfo){
    if (this.InvokeRequired){
        SetPos setpos = new SetPos(SetTextMesssage);
        this.Invoke(setpos, new object[] { ipos,vinfo });
    }
    else{
        this.label1.Text = ipos.ToString() + "/1000";
        this.progressBar1.Value = Convert.ToInt32(ipos);
        this.textBox1.AppendText(vinfo);
    }
}

4、函数实现

private void button1_Click(object sender, EventArgs e){
    Thread fThread = new Thread(new ThreadStart(SleepT));
    fThread.Start();
}

5、新的线程执行函数:
private void SleepT(){
for (int i = 0; i < 500; i++){
System.Threading.Thread.Sleep(10);
SetTextMesssage(100*i/500,i.ToString()+“\r\n”);
}
}
程序运行效果图:

在这里插入图片描述

方法二:通过控件backgroundWorker1实现

1、主窗体设计:
在这里插入图片描述

控件名称:button1;backgroundWorker1;

对backgroundWorker1控件,属性设置:

在这里插入图片描述

2、主页面后台代码:

using System.Threading;//引用空间名称
private void button1_Click(object sender, EventArgs e){
    this.backgroundWorker1.RunWorkerAsync(); // 运行 backgroundWorker 组件
    ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
    form.ShowDialog(this);
    form.Close();
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){
    if (e.Error != null){
        MessageBox.Show(e.Error.Message);
    }
    else if (e.Cancelled){
    }
    else{
    }
}

//你可以在这个方法内,实现你的调用,方法等。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){
    BackgroundWorker worker = sender as BackgroundWorker;
    for (int i = 0; i < 100; i++){
        Thread.Sleep(100);
        worker.ReportProgress(i);
        if (worker.CancellationPending){  // 如果用户取消则跳出处理数据代码 
            e.Cancel = true;
            break;
        }
    }
}

分别为button控件和backgroundWorker1控件选好事件。

3、设置子窗体(及显示进度条的窗体):
在这里插入图片描述

控件名称:progressBar1;button1

4、子窗体
后台代码:

private BackgroundWorker backgroundWorker1; //ProcessForm 窗体事件(进度条窗体)

public ProcessForm(BackgroundWorker backgroundWorker1){
    InitializeComponent();
    this.backgroundWorker1 = backgroundWorker1;
    this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
}
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){
    //this.Close();//执行完之后,直接关闭页面
}
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e){
    this.progressBar1.Value = e.ProgressPercentage;
}
private void button1_Click(object sender, EventArgs e){
    this.backgroundWorker1.CancelAsync();
    this.button1.Enabled = false;
    this.Close();
}

只为button选好事件

执行效果为:

在这里插入图片描述


http://www.kler.cn/a/307649.html

相关文章:

  • 【数据结构】线性表——栈与队列
  • Apache Paimon、Apache Hudi、Apache Iceberg对比分析
  • redis linux 安装
  • react 中 memo 模块作用
  • 31-Shard Allocation Awareness(机架感知)
  • 将单色像素值转换成灰阶屏的灰度序列的算法
  • 使用模拟退火算法进行优化的案例:Python实现与详细介绍
  • 鹏哥C语言24---结构体struct
  • java基础(小技巧)
  • Objects as Points基于中心点的目标检测方法CenterNet—CVPR2019
  • 鸡蛋检测系统源码分享
  • Spring Cloud Gateway中的常见配置
  • Android Framework(六)WMS-窗口显示流程——窗口内容绘制与显示
  • Python 将矩阵转换为行最简形式 (Row Echelon Form, REF)和列最简形式 (Column Echelon Form, CEF)
  • SpringBoot2:web开发常用功能实现及原理解析-上传与下载
  • Python学习笔记--面向对象、类、属性、继承、正则表达式、错误和异常
  • 基于python+django+vue的个性化餐饮管理系统
  • 数据结构——原来二叉树可以这么学?(4.链式二叉树)
  • 使用HTML和CSS制作网页的全面指南
  • Wordpress右下角表单弹出插件
  • 【Gateway】网关服务快速上手
  • 形而上学(Metaphysics)
  • 北京通州自闭症学校推荐:打造和谐学习氛围,助力孩子成长
  • Big Data 流处理框架 Flink
  • Ubuntu 24.04 上安装 Conda
  • Docker与虚拟机的差异?