首页 > 编程语言 >c#进度条实现方法

c#进度条实现方法

时间:2024-09-11 11:49:39浏览次数:13  
标签:控件 sender 进度条 c# void private backgroundWorker1 方法

在使用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选好事件

执行效果为:

在这里插入图片描述

标签:控件,sender,进度条,c#,void,private,backgroundWorker1,方法
From: https://blog.csdn.net/weixin_51705943/article/details/141676408

相关文章

  • rsync 学习笔记(一)编译
    一、背景 rsync二进制程序依赖外部库,由于安全问题,有时会单独升级依赖的外部库。另外为了防止因为栈溢出攻击导致服务器被黑,需要对rsync及其依赖的外部库重新编译,开启安全编译选项,增加黑客破解的复杂度。 所有的库编译必须要求加上如下编译选项:栈保护(-fstack-protector-al......
  • CTS2024
    水镜先考虑如何判定一个区间\([l,r]\)是否合法。首先肯定存在一个分割点\(mid\),使得\([l,mid]\)取\(\min(h_i,2L-h_i)\),\((mid,r]\)取\(\max(h_i,2L-h_i)\)。因此,记\(p_i=\max(h_i,2L-h_i)\),则\(p_i\)需要先不升,再不降,并且只能在转弯处有至多一对相等。考虑其反面,......
  • Invicti v24.9.0 发布下载,新增功能概览
    Invictiv24.9.0forWindows-Web应用程序安全测试InvictiStandardv24.9.0–10Sep2024请访问原文链接:https://sysin.org/blog/invicti/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgInvicti是一种自动化但完全可配置的Web应用程序安全扫描程序,使您能够......
  • Parallels Desktop 20 发布下载,macOS Sequoia 和 Windows 11 24H2 支持准备就绪
    ParallelsDesktopforMac20.0.0(build55653)-在Mac上运行WindowsmacOSSequoia和Windows1124H2支持准备就绪请访问原文链接:https://sysin.org/blog/parallels-desktop/,查看最新版。原创作品,转载请保出处。作者主页:sysin.org在Mac上运行Windows全新登场Pa......
  • [Linux] Microsoft Teams 无法进行屏幕分享
    在Ubuntu22.04中,MicrosoftTeams无法进行屏幕分享的问题可能与桌面环境中的屏幕共享集成缺失有关。运行以下命令可以解决这个问题:sudoaptinstallxdg-desktop-portal-gnomexdg-desktop-portalxdg-desktop-portal是一个通用的桌面门户服务,它提供了一组标准接口,允许沙盒......
  • 记一次Fidder Script自动修改包
    FiddlerScript的本质是用JScript.NET编写的一个脚本文件CustomRules.js但是它的语法很像C#但又有些不一样,比如不能使用@符号通过修改CustomRules.js可以灵活修改请求报文和响应报文,也无需中断程序。同时也可以利用它针对不同的URL做各种特殊处理。Fiddler安装时已经自带了Fidd......
  • 主流敏捷管理工具scrum工具推荐
    ​在当今的快速变化和高需求的业务环境中,敏捷开发已经成为许多企业实现快速迭代和响应市场需求的重要方法。而在众多敏捷工具中,选择适合自己团队的工具尤为重要。今天,我们将对比几款主流的敏捷工具,供参考1.Leangoo领歌:一站式敏捷研发管理工具在众多敏捷工具中,Leangoo领歌以其......
  • 通过scanner与用户交互
    用户交互scanner代码,使用Linepackagecom.scanner;importjava.util.Scanner;publicclassDemo01{publicstaticvoidmain(String[]args){//创建一个扫描器对象,用于接收键盘数据Scannerscanner=newScanner(System.in);System.out.......
  • 基于单片机设计的水平仪(STC589C52+MPU6050)
    一、前言【1】项目背景水平仪是一种常见的测量工具,用于检测物体或设备的水平姿态。在许多应用中,如建筑、制造和航空等领域,保持设备的水平姿态是非常重要的。为了实现实时的水平检测和显示,基于单片机设计的水平仪是一个常见的解决方案。数字水平仪是一种用于测量物体相对于水平面的......
  • LeetCode: 673.最长子序列的数量 动态规划 时间复杂度O(n*n)
    673.最长子序列的数量LeetCode原题连接673.最长子序列的数量题目描述给定一个未排序的整数数组,找到最长递增子序列的个数。示例1:输入:[1,3,5,4,7]输出:2解释:有两个最长递增子序列,分别是[1,3,4,7]和[1,3,5,7]。示例2:输入:[2,2,2,2,2]输出:5......