c# progressBar使用

zhaojunv3z810 2010-02-10 10:56:50
我要上传一个大文件,由于时间很长,不知道什么时候结束。C#中怎么样使用progressBar能够知道现在上传文件的进度呢?
...全文
12844 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxy649359628 2011-12-31
  • 打赏
  • 举报
回复
找了发久的说
zhq5223984 2011-12-03
  • 打赏
  • 举报
回复
好帖,一定要学习!!!
liuxp1987 2011-10-03
  • 打赏
  • 举报
回复
正在找这样的例子
yu8440348 2011-08-25
  • 打赏
  • 举报
回复
为什么用了12楼的代码,进度条不动呢
Jave.Lin 2010-02-23
  • 打赏
  • 举报
回复
Good 贴,学习。.........
zhaojunv3z810 2010-02-11
  • 打赏
  • 举报
回复
谢谢大家给我提供了这么多宝贵的建议
zhaojunv3z810 2010-02-10
  • 打赏
  • 举报
回复
引用 2 楼 wxm3630478 的回复:
C# code//一个模拟.....也可能不适合你,不知道你的发送文件代码是怎么写的privatevoid button3_Click(object sender, EventArgs e)
{
Thread thread=new Thread(new ThreadStart(Send));
thread.Start();
}privatevoid Send()
{int i=0;while (i<=100)
{//显示进度 信息this.ShowPro(i);//循环发生文件//模拟的 i++;//模拟发送多少 Thread.Sleep(100);
}
Thread.CurrentThread.Abort();
}privatevoid ShowPro(int value)
{if (this.InvokeRequired)
{this.Invoke(new ProgressBarShow(ShowPro), value);
}else
{this.progressBar1.Value= value;this.label1.Text= value+"%";
}
}


wxm3630478:谢谢你的好代码
另:听说可以用onPaint()函数,有这方面的sample吗
wxm3630478 2010-02-10
  • 打赏
  • 举报
回复

//一个模拟.....也可能不适合你,不知道你的发送文件代码是怎么写的
private void button3_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(Send));
thread.Start();
}

private void Send()
{
int i = 0;
while (i <= 100)
{
//显示进度 信息
this.ShowPro(i);
//循环发生文件
//模拟的
i++; //模拟发送多少
Thread.Sleep(100);
}
Thread.CurrentThread.Abort();
}

private void ShowPro(int value)
{
if (this.InvokeRequired)
{
this.Invoke(new ProgressBarShow(ShowPro), value);
}
else
{
this.progressBar1.Value = value;
this.label1.Text = value + "%";
}
}
huwei12345 2010-02-10
  • 打赏
  • 举报
回复
造个假的。。。。

大多数都是假的
whb147 2010-02-10
  • 打赏
  • 举报
回复
前几天刚用过,修改了一下,参考了一位前辈的例子
http://blog.mylover.cn/2009/02/post-3.html


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

namespace TestProgressBar
{
public partial class TestForm : Form
{
//线程开始的时候调用的委托
private delegate void maxValueDelegate(WordEventArgs e);
//线程执行中调用的委托
private delegate void nowValueDelegate(WordEventArgs e);
//线程执行结束调用的委托
private delegate void endValueDelegate(WordEventArgs e);

public TestForm()
{
InitializeComponent();
}

private void btn_Test_Click(object sender, EventArgs e)
{
Worker worker = new Worker();

/// 订阅事件
worker.OnStartWorkEvent += new WorkEventHandler(this.OnStartWorkEventHandler);
worker.OnDoWorkEvent += new WorkEventHandler(this.OnDoWorkEventHandler);
worker.OnEndWorkEvent += new WorkEventHandler(this.OnEndWorkEventHandler);

Thread thread = new Thread(new ThreadStart(worker.Work));
thread.Start();
}

/// <summary>
/// 线程开始事件,设置进度条最大值,需要一个委托来替我完成
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void OnStartWorkEventHandler(object sender, WordEventArgs e)
{
maxValueDelegate max = new maxValueDelegate(SetMaxValue);
this.Invoke(max, e);
}

/// <summary>
/// 线程执行中的事件,设置进度条当前进度,需要一个委托来替我完成
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void OnDoWorkEventHandler(object sender, WordEventArgs e)
{
nowValueDelegate now = new nowValueDelegate(SetNowValue);
this.Invoke(now, e);
}

/// <summary>
/// 线程完成事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void OnEndWorkEventHandler(object sender, WordEventArgs e)
{
endValueDelegate end = new endValueDelegate(SetEndValue);
this.Invoke(end, e);
}

/// <summary>
/// 被委托调用,专门设置进度条最大值的
/// </summary>
/// <param name="maxValue"></param>
private void SetMaxValue(WordEventArgs e)
{
this.probar_Test.Maximum = e.Position;
lbl_Info.Text = e.Info;
}

/// <summary>
/// 被委托调用,专门设置进度条当前值的
/// </summary>
/// <param name="nowValue"></param>
private void SetNowValue(WordEventArgs e)
{
this.probar_Test.Value = e.Position;
lbl_Info.Text = e.Info;
}

/// <summary>
/// 被委托调用,专门设置进度条结束后的处理
/// </summary>
/// <param name="nowValue"></param>
private void SetEndValue(WordEventArgs e)
{
this.probar_Test.Value = e.Position; ;
lbl_Info.Text = e.Info;
MessageBox.Show(e.Info);

}

}
}


using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace TestProgressBar
{
public delegate void WorkEventHandler(object sender, WordEventArgs e);

class Worker
{
/// <summary>
/// 开始事件
/// </summary>
public event WorkEventHandler OnStartWorkEvent;
/// <summary>
/// 执行时事件
/// </summary>
public event WorkEventHandler OnDoWorkEvent;
/// <summary>
/// 结束事件
/// </summary>
public event WorkEventHandler OnEndWorkEvent;
public Worker()
{ }

private void SendEvents(WordEventArgs e)
{
switch (e.Stage)
{
case WorkStage.BeginWork:
if (OnStartWorkEvent != null) OnStartWorkEvent(this, e);
break;
case WorkStage.DoWork:
if (OnDoWorkEvent != null) OnDoWorkEvent(this, e);
break;
case WorkStage.EndWork:
if (OnEndWorkEvent != null) OnEndWorkEvent(this, e);
break;
default:
if (OnDoWorkEvent != null) OnDoWorkEvent(this, e);
break;

}

}

public void Work()
{
int iTotal = 100;//计算工作量,这里是设置为100,如果是上传,或者下载,就是文件的大小,循环遍历的话,这就是最大的那个循环数
SendEvents(new WordEventArgs(WorkStage.BeginWork, "开始工作!", iTotal));
int iCount = 0;
for (int i = 0; i < iTotal; i++)
{
Thread.Sleep(50);//休息50毫秒,模拟执行大数据量操作,
iCount = i; // 此处计算所处的位置,如果是上传或者下载了多少了,
SendEvents(new WordEventArgs(WorkStage.DoWork, "正在工作ing " + iCount.ToString(), iCount));
}

SendEvents(new WordEventArgs(WorkStage.EndWork, "结束工作!", iTotal));
}

}

class WordEventArgs : EventArgs
{
//主要是用来往外传递信息的
public WorkStage Stage;
public string Info = "";
public int Position = 0;
public WordEventArgs(WorkStage Stage, string Info, int Position)
{
this.Stage = Stage;
this.Info = Info;
this.Position = Position;
}
}

public enum WorkStage
{
BeginWork, //准备工作
DoWork, //正在工作
EndWork, //工作结束
}
}

duwa789 2010-02-10
  • 打赏
  • 举报
回复
PS:用BackgroundWorker避免无响应
whb147 2010-02-10
  • 打赏
  • 举报
回复
用一个委托
文件的大小就是进度条的总长度
然后上传的时候,根据上传的大小修改进度条的长度(此地加事件)
在外面订阅上面的事件

wxm3630478 2010-02-10
  • 打赏
  • 举报
回复
把文件转换成byte[]
zhaojunv3z810 2010-02-10
  • 打赏
  • 举报
回复
引用 6 楼 mervyn807 的回复:
文件大小是进度条的总量
计算已经发送的量不就好了

一个文件的情况下:我怎么在上传的过程中知道已上传的size呢?
zhaojunv3z810 2010-02-10
  • 打赏
  • 举报
回复
引用 4 楼 castlooo 的回复:
上传的时候 分段上传,每上传一段,进度条走一段,呵呵

Good idea!!
缭绕飘渺 2010-02-10
  • 打赏
  • 举报
回复
文件大小是进度条的总量
计算已经发送的量不就好了
flyerwing 2010-02-10
  • 打赏
  • 举报
回复
这得看楼猪使用时的具体情况了
castlooo 2010-02-10
  • 打赏
  • 举报
回复
上传的时候 分段上传,每上传一段,进度条走一段,呵呵

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧