当前位置:编程学习 > C#/ASP.NET >>

怎么用.net做进度条呀?

怎么用.net做进度条呀?要用多线程吗? --------------------编程问答-------------------- 有个System.Windows.Forms.ProgrssBar类,这个类就可以完成进度条的操作,具体可以查MSDN --------------------编程问答-------------------- 应该不用多线程,ProgrssBar有对应进度属性,这个值等于你目前进度的比例就行了。 --------------------编程问答-------------------- 可以生命个BackgroundWorker的对象,它就是来执行后台线程的,比如一个需要较长时间的操作。这个类有个RunWorkerAsync()方法,这个方法会启动一个后台线程,然后产生DoWork事件。BackgroundWorker的对象可以接受处理这个事件。BackgroundWorker的对象还有个ReportProgress()方法,它会产生ProgressChanged事件,然后在这个事件的处理函数里就可以更新进度条了。
下面给个例子:MSDN上的

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

class FibonacciNumber : Form
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new FibonacciNumber());
}

private StatusStrip progressStatusStrip;
private ToolStripProgressBar toolStripProgressBar;
private NumericUpDown requestedCountControl;
private Button goButton;
private TextBox outputTextBox;
private BackgroundWorker backgroundWorker;
private ToolStripStatusLabel toolStripStatusLabel;
private int requestedCount;

public FibonacciNumber()
{
Text = "Fibonacci";

// Prepare the StatusStrip.
    progressStatusStrip = new StatusStrip();
toolStripProgressBar = new ToolStripProgressBar();
toolStripProgressBar.Enabled = false;
toolStripStatusLabel = new ToolStripStatusLabel();
progressStatusStrip.Items.Add(toolStripProgressBar);
progressStatusStrip.Items.Add(toolStripStatusLabel);

FlowLayoutPanel flp = new FlowLayoutPanel();
flp.Dock = DockStyle.Top;

Label beforeLabel = new Label();
beforeLabel.Text = "Calculate the first ";
beforeLabel.AutoSize = true;
flp.Controls.Add(beforeLabel);
requestedCountControl = new NumericUpDown();
requestedCountControl.Maximum = 1000;
requestedCountControl.Minimum = 1;
requestedCountControl.Value = 100;
flp.Controls.Add(requestedCountControl);
Label afterLabel = new Label();
afterLabel.Text = "Numbers in the Fibonacci sequence.";
afterLabel.AutoSize = true;
flp.Controls.Add(afterLabel);

goButton = new Button();
goButton.Text = "&Go";
goButton.Click += new System.EventHandler(button1_Click);
flp.Controls.Add(goButton);

outputTextBox = new TextBox();
outputTextBox.Multiline = true;
outputTextBox.ReadOnly = true;
outputTextBox.ScrollBars = ScrollBars.Vertical;
outputTextBox.Dock = DockStyle.Fill;

Controls.Add(outputTextBox);
Controls.Add(progressStatusStrip);
Controls.Add(flp);

backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

}


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// This method will run on a thread other than the UI thread.
// Be sure not to manipulate any Windows Forms controls created
// on the UI thread from this method.
backgroundWorker.ReportProgress(0, "Working...");
Decimal lastlast = 0;
Decimal last = 1;
Decimal current;
if (requestedCount >= 1)
{ AppendNumber(0); }
if (requestedCount >= 2)
{ AppendNumber(1); }
for (int i = 2; i < requestedCount; ++i)
{
// Calculate the number.
checked { current = lastlast + last; }
// Introduce some delay to simulate a more complicated calculation.
System.Threading.Thread.Sleep(100);
AppendNumber(current);
backgroundWorker.ReportProgress((100 * i) / requestedCount, "Working...");
// Get ready for the next iteration.
lastlast = last;
last = current;
}


backgroundWorker.ReportProgress(100, "Complete!");
}

private delegate void AppendNumberDelegate(Decimal number);
private void AppendNumber(Decimal number)
{
if (outputTextBox.InvokeRequired)
{ outputTextBox.Invoke(new AppendNumberDelegate(AppendNumber), number); }
else
{ outputTextBox.AppendText(number.ToString("N0") + Environment.NewLine); }
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
toolStripProgressBar.Value = e.ProgressPercentage;
toolStripStatusLabel.Text = e.UserState as String;
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error is OverflowException)
{ outputTextBox.AppendText(Environment.NewLine + "**OVERFLOW ERROR, number is too large to be represented by the decimal data type**"); }
toolStripProgressBar.Enabled = false;
requestedCountControl.Enabled = true;
goButton.Enabled = true;

}

private void button1_Click(object sender, EventArgs e)
{
goButton.Enabled = false;
toolStripProgressBar.Enabled = true;
requestedCount = (int)requestedCountControl.Value;
requestedCountControl.Enabled = false;
outputTextBox.Clear();
backgroundWorker.RunWorkerAsync();
}
}

--------------------编程问答-------------------- 注意 BackgroundWorker 的三个事件的写法 --------------------编程问答-------------------- 最好是使用多线程
后台计算,这样界面可以保证实时响应。 --------------------编程问答-------------------- backgroundWorker.ReportProgress((100 * i) / requestedCount, "Working...");
像这样的计算可以报告进度,那么像读写数据库之类的一系列操作怎么报告呢?
--------------------编程问答-------------------- 留名学习 --------------------编程问答--------------------
││博客空间:http://blog.csdn.net/lovingkiss
││资源下载:http://download.csdn.net/user/lovingkiss
││Email:loving-kiss@163.com [MSN也是这个]
││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤ 
看我的资源,一行代码解决进度等待问题。。。 --------------------编程问答-------------------- 学习一下 --------------------编程问答-------------------- 学习~:) --------------------编程问答-------------------- 不用的,有个progress类供你使用,你通过调整他的maxvalue,...等几个属性值就ok了
--------------------编程问答-------------------- 顶下。 --------------------编程问答-------------------- 不用这么麻烦,直接拖一个processbar控件,在属性中可以设定最大值,最小值
在程序中,的某些点,你认为可以让进度条增长的地方,就 processbar1.Value = 你想要的值,只要不超过最大值就行,在程序中分别用几个点,都这么写,每次value加一点
然后再程序的最后 再写上processbar1.Value = 最大值 就可以了,想重置就让value = 0。 --------------------编程问答-------------------- 顶下。 --------------------编程问答-------------------- 最好使用多现成 否则很难同步 会出现进度条存在 而动作已完成 --------------------编程问答--------------------
引用 13 楼 llwinnner 的回复:
不用这么麻烦,直接拖一个processbar控件,在属性中可以设定最大值,最小值 
在程序中,的某些点,你认为可以让进度条增长的地方,就 processbar1.Value = 你想要的值,只要不超过最大值就行,在程序中分别用几个点,都这么写,每次value加一点 
然后再程序的最后 再写上processbar1.Value = 最大值 就可以了,想重置就让value = 0。

这个没问题的,你程序执行完了,进度条也走完了 --------------------编程问答-------------------- 学习下 --------------------编程问答-------------------- 学习学习学习 --------------------编程问答-------------------- 首先是你web还是winform啊?
winform肯定要使用多线程啊,不然没反映,或者阻塞主线程 --------------------编程问答-------------------- 不同意3楼的“生命”backgroundWorker 控件。
vb code :
dim BackgroundWorker1as BackgroudWorker = new BackgroudWorker()
 BackgroundWorker1.WorkerReportsProgress = True
        AddHandler BackgroundWorker1.DoWork, AddressOf BackgoundWorker1_DoWork
        AddHandler BackgroundWorker1.RunWorkerCompleted, AddressOf Back_RunWorkerCompleted
        AddHandler BackgroundWorker1.ProgressChanged, AddressOf back_ProgressChanged
        BackgroundWorker1.RunWorkerAsync() --------------------编程问答-------------------- 第二步:把你的长时间操作函数放到 DoWork 里执行,注意执行的时候不要动界面控件
Private Sub BackgoundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
        长时间操作的函数()
   End Sub
--------------------编程问答-------------------- 第三步:在进度改变事件里更新进度条的值。

Private Sub back_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
        Me.[进度条].Value = e.ProgressPercentage
        Me.Label1.Text = String.Format("加载完成%{0}", e.ProgressPercentage)
    End Sub


这样就可以了 --------------------编程问答-------------------- 必须多线程  否则根本没有进度条效果  主线程跑进度条  另一线程去干活 --------------------编程问答-------------------- 有用的是学习,再学习
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,