VB6とは大きく異なる動作をするVB.NETプログラムでプログレスバーを使用する必要があります。たとえば、いくつかのループを介してdatagridviewを埋め、プログレスバーでその進行状況を表示する手順がある場合、何が起こったのでしょうか。
Datagridviewは100%、プログレスバーは約50%になります。
これが問題を説明するためのサンプルプログラムです。新しいプロジェクトを作成し、Windowsフォームを追加して、このコードをForm1のコードにコピーするだけです。
Public Class Form1
Dim myMax As Integer = 100000
Dim pb As New ProgressBar
Dim dgv As New DataGridView
Dim WithEvents ti As New Timer
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
With Me
.Width = 400
.Height = 250
.Controls.Add(pb)
With pb
.Maximum = myMax
.Dock = DockStyle.Bottom
End With
.Controls.Add(dgv)
With dgv
.ColumnCount = 2
.Dock = DockStyle.Fill
.Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
.Visible = False
End With
End With
ti.Start()
End Sub
Private Sub OnFormLoaded(ByVal sender As Object, ByVal e As EventArgs) Handles ti.Tick
ti.Enabled = False
ti.Dispose()
Dim temp As Integer
For t = 0 To myMax
If t Mod 100 = 0 Then
pb.Value = t
pb.Refresh()
Application.DoEvents()
temp += 1
dgv.Rows.Add(New String() { _
t.ToString, _
temp.ToString _
})
End If
Next
pb.Value = myMax
pb.Visible = False
dgv.Visible = True
dgv.Focus()
End Sub
End Class
このコードは、いくつかのコントロールを作成し、フォームをロードし、ループを開始してデータを入力し、進行状況をプログレスバーに表示します。その後、プログラムはプログレスバーを非表示にし、データグリッドビューに具体的な(実際の)プログラムの通常の状況を表示します。
問題は、データグリッドビューの入力とプログレスバーの更新の両方が同じループから(100ステップ単位で)行われるにもかかわらず、データグリッドビューの入力は、プログレスバーが進行状況を表示して約50%で非表示にするよりもはるかに速く終了することです。
これは、塗りつぶしと表示が完全に同期され、プログレスバーが100%の値に達した後にグリッドが表示されるVB6とは大きく異なります。
表示されたコードでVB.NETのプログレスバーのそのような機能を取得するにはどうすればよいですか?
プログレスバーとDoEventsを更新してみましたが、期待どおりに機能させるには不十分です。