【问题标题】:How to use a ProgressBar properly in VB.NET如何在 VB.NET 中正确使用 ProgressBar
【发布时间】:2013-01-29 07:56:55
【问题描述】:

我必须在我的 VB.NET 程序中使用进度条,它的行为与 VB6 中的非常不同。例如,如果我有一个通过某个循环填充数据网格视图并使用进度条显示进度的过程会发生什么?
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

此代码创建了一些控件,加载了一个表单并启动了一个循环来填充数据并在进度条中显示该进度。在该程序隐藏进度条并显示数据网格视图之后,具体(实际)程序中的常见情况是什么。

问题是,尽管 datagridview 填充和更新进度条都来自同一个循环(以 100 为步长),但 datagridview 的填充结束速度比进度条显示进度并隐藏大约 50% 快得多。

这与 VB6 有很大不同,VB6 的填充和显示是完全同步的,并且在进度条达到 100% 值后才会显示网格。

如何在 VB.NET 中在显示的代码中获得这样的进度条功能?
我尝试刷新进度条和 DoEvents,但这还不足以让它按预期工作。

【问题讨论】:

标签: vb.net


【解决方案1】:

为了解决这个问题,而不是仅仅从 ProgressBar 做一个“线程科幻”,你必须使用一种通常与微软的 GUI 工具包一起使用的技术。

这种方法可能可以解决您的具体问题:

    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

【讨论】:

  • 是的,它有效,但如何?只是减少值如何产生这种效果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多