4

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を更新してみましたが、期待どおりに機能させるには不十分です。

4

1 に答える 1

2

ProgressBarだけから「スレッド化されたサイエンスフィクション」を実行せずにこの問題を解決するには、MicrosoftのGUIツールキットでよく使用される1つの手法を使用する必要があります。

そのようなアプローチはおそらくあなたの具体的な問題を解決することができます:

    If t Mod 100 = 0 Then
        pb.Value = t
     If pb.Value > 0 Then pb.Value -= 1

        temp += 1

        dgv.Rows.Add(New String() { _
            t.ToString, _
            temp.ToString _
            })
    End If
于 2013-01-29T10:13:14.930 に答える