# C# 中Progress 类的使用

 Visual Studio

# 设置 Windows 窗体 ProgressBar 控件显示的值

.NET Framework 使您可以使用多种不同的方法在 ProgressBar 控件中显示给定的值。选择的方法将取决于您所要执行的任务或要解决的问题：

• 直接设置 ProgressBar 控件的值。如果您知道任务中涉及的测量项总数，此方法非常有用，例如从数据源中读取记录。此外，如果您只需要设置该值一次或两次，这将是实现该目的的简便方法。最后，如果您需要减小进度栏显示的值，请使用此方法。
• 使 ProgressBar 的显示值按固定值递增。如果需要显示最小值和最大值之间的简单计数，此方法非常有用，例如运行时间或已知文件总数中已处理的文件数。
• 使 ProgressBar 的显示值按可变值递增。如果需要多次以不同数量更改显示值，此方法非常有用。例如，显示将一系列文件写入磁盘时所占用的硬盘空间量。

## 直接设置 ProgressBar 值

1. 设置 ProgressBar 控件的 MinimumMaximum 值。
2. 在代码中，将该控件的 Value 属性设置为已设定的最小值和最大值之间的整数值。
注意   如果为 Value 属性设置的值超出了由 MinimumMaximum 属性确定的边界，则该控件将引发 ArgumentException 异常。

以下示例阐释如何直接设置 ProgressBar 值。该代码从数据源中读取记录，并在每次读取数据记录时更新进度栏和标签。本示例假设您的窗体具有一个 Label 控件、一个 ProgressBar 控件以及一个数据表，该数据表中名为 CustomerRow 的行具有 FirstName  Last Name 字段。

' Visual Basic
Public Sub CreateNewRecords()
' Sets the progress bar's Maximum property to
' the total number of records to be created.
ProgressBar1.Maximum = 20

' Creates a new record in the dataset.
' NOTE: The code below will not compile, it merely
' illustrates how the progress bar would be used.
Dim anyRow As CustomerRow = DatasetName.ExistingTable.NewRow
anyRow.FirstName = "Stephen"
anyRow.LastName = "James"

' Increases the value displayed by the progress bar.
   ProgressBar1.Value += 1
Label1.Text = "Records Read = " & ProgressBar1.Value.ToString()
End Sub

// C#
public void createNewRecords()
{
// Sets the progress bar's Maximum property to
// the total number of records to be created.
progressBar1.Maximum = 20;

// Creates a new record in the dataset.
// NOTE: The code below will not compile, it merely
// illustrates how the progress bar would be used.
CustomerRow anyRow = DatasetName.ExistingTable.NewRow();
anyRow.FirstName = "Stephen";
anyRow.LastName = "James";

// Increases the value displayed by the progress bar.
progressBar1.Value += 1;
label1.Text = "Records Read = " + progressBar1.Value.ToString();
}

## 使 ProgressBar 值按固定时间间隔递增

1. 设置 ProgressBar 控件的 MinimumMaximum 值。
2. 将控件的 Step 属性设置为一个整数，该整数代表进度栏的显示值增加的数量。
3. 调用 PerformStep 方法，使显示值按 Step 属性中设置的数量更改。

以下示例阐释进度栏如何维护复制操作中的文件计数。

在以下示例中，将每个文件读入内存时，进度栏和标签都会进行更新，以反映读取的文件总数。此示例假定您的窗体具有 Label 控件和 ProgressBar 控件。

' Visual Basic
' Sets the progress bar's minimum value to a number representing
' no operations complete -- in this case, no files read.
ProgressBar1.Minimum = 0
' Sets the progress bar's maximum value to a number representing
' all operations complete -- in this case, all five files read.
ProgressBar1.Maximum = 5
' Sets the Step property to amount to increase with each iteration.
' In this case, it will increase by one with every file read.
ProgressBar1.Step = 1

' Dimensions a counter variable.
Dim i As Integer
' Uses a For...Next loop to iterate through the operations to be
' completed. In this case, five files are to be copied into memory,
' so the loop will execute 5 times.
For i = 0 To 4
' Insert code to copy a file
      ProgressBar1.PerformStep()
' Update the label to show that a file was read.
Label1.Text = "# of Files Read = " & ProgressBar1.Value.ToString
Next i
End Sub

// C#
{
// Sets the progress bar's minimum value to a number representing
// no operations complete -- in this case, no files read.
progressBar1.Minimum = 0;
// Sets the progress bar's maximum value to a number representing
// all operations complete -- in this case, all five files read.
progressBar1.Maximum = 5;
// Sets the Step property to amount to increase with each iteration.
// In this case, it will increase by one with every file read.
progressBar1.Step = 1;

// Uses a for loop to iterate through the operations to be
// completed. In this case, five files are to be copied into memory,
// so the loop will execute 5 times.
for (int i = 0; i <= 4; i++)
{
// Inserts code to copy a file
progressBar1.PerformStep();
label1.Text = "# of Files Read = " + progressBar1.Value.ToString();
}
}

## 使 ProgressBar 值按可变数量递增

1. 设置 ProgressBar 控件的 MinimumMaximum 值。
2. 调用 Increment 方法，使显示值按指定的整数更改。

以下示例阐释在复制操作期间，进度栏如何计算已使用的磁盘空间量。有关确定当前可用的磁盘空间的更多信息，请参见代码：查找可用的磁盘空间量 (Visual Basic)

在以下示例中，将每个文件写入硬盘时，进度栏和标签都会进行更新，以反映可用的硬盘空间量。此示例假定您的窗体具有 Label 控件和 ProgressBar 控件。

' Visual Basic
' Sets the progress bar's minimum value to a number
' representing the hard disk space before the files are read in.
' You will most likely have to set this using a system call.
' NOTE: The code below is meant to be an example and
' will not compile.
ProgressBar1.Minimum = AvailableDiskSpace()
' Sets the progress bar's maximum value to a number
' representing the total hard disk space.
' You will most likely have to set this using a system call.
' NOTE: The code below is meant to be an example
' and will not compile.
ProgressBar1.Maximum = TotalDiskSpace()

' Dimension a counter variable.
Dim i As Integer
' Uses a For...Next loop to iterate through the operations to be
' completed. In this case, five files are to be written to the disk,
' so it will execute the loop 5 times.
For i = 1 To 5
' Insert code to read a file into memory and update file size.
' Increases the progress bar's value based on the size of
' the file currently being written.
      ProgressBar1.Increment(FileSize)
' Updates the label to show available drive space.
Label1.Text = "Current Disk Space Used = " &_
ProgressBar1.Value.ToString()
Next i
End Sub

// C#
{
// Sets the progress bar's minimum value to a number
// representing the hard disk space before the files are read in.
// You will most likely have to set this using a system call.
// NOTE: The code below is meant to be an example and
// will not compile.
progressBar1.Minimum = AvailableDiskSpace();
// Sets the progress bar's maximum value to a number
// representing the total hard disk space.
// You will most likely have to set this using a system call.
// NOTE: The code below is meant to be an example
// and will not compile.
progressBar1.Maximum = TotalDiskSpace();

// Uses a for loop to iterate through the operations to be
// completed. In this case, five files are to be written
// to the disk, so it will execute the loop 5 times.
for (int i = 1; i<= 5; i++)
{
// Insert code to read a file into memory and update file size.
// Increases the progress bar's value based on the size of
// the file currently being written.
progressBar1.Increment(FileSize);
// Updates the label to show available drive space.
label1.Text = "Current Disk Space Used = " + progressBar1.Value.ToString();
}
}

#### 请参见

Windows 窗体 ProgressBar 控件介绍 | ProgressBar 控件（Windows 窗体） | ProgressBar 类

[C#]
private void CopyWithProgress(string[] filenames)
{
// Display the ProgressBar control.
pBar1.Visible = true;
// Set Minimum to 1 to represent the first file being copied.
pBar1.Minimum = 1;
// Set Maximum to the total number of files to copy.
pBar1.Maximum = filenames.Length;
// Set the initial value of the ProgressBar.
pBar1.Value = 1;
// Set the Step property to a value of 1 to represent each file being copied.
pBar1.Step = 1;
// Loop through all files to copy.
for (int x = 1; x <= filenames.Length; x++)
{
// Copy the file and increment the ProgressBar if successful.
if(CopyFile(filenames[x-1]) == true)
{
// Perform the increment on the ProgressBar.
pBar1.PerformStep();
}
}
}