0

我有一个显示进度表的小型 VB.Net 程序。在该框中,我在文本框中显示进度条和完成百分比。这两个都可以通过一个整数得出,但现在我被要求在进度表单上放置一个“详细信息”文本框,该文本框会更新文本以显示工作的执行情况。

我的问题 - 我如何将百分比和文本详细信息传递给ProgressChanged()函数?我试过传递一个数组和一个对象,但我似乎无法正确处理。谢谢。

我正在调用这样的函数(来自bw_DoWork()函数) -

details = "Textbox details will go here"
progress = (100 / (UBound(servers) + 1)) * (i + 1)
bw.ReportProgress(progress) ' How do I also pass 'details'?

这是它自己的功能 -

Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)

    Me.proProgress.Value = e.ProgressPercentage
    Me.txtProgress.Text = e.ProgressPercentage.ToString() & "% complete..."
    'Me.txtDetails.Text = Me.txtDetails.Text & IIf(Me.txtDetails.Text <> "", vbCrLf, "") & e.details ' How do I also pass 'details'?

End Sub
4

2 回答 2

1

最好的方法是创建您自己的自定义“状态”对象,其中包含您要传递给处理进度更改的所有数据。然后,您将其作为 userState 对象的一部分包含在您的调用中。

Public Class MyObjectState
    Public Message As String
    Public StatusState As String  
    Public Whatever as Integer
    Public Whosit as Decimal
End Class

...

Dim currentState as New MyObjectState()
currentState.Message = "blah blah blah"

bw.ReportProgress(progress, someMyObjectStateInstance)

...


Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e as ProgressChangedEventArgs) 
    Me.proProgress.Value = e.ProgressPercentage 

    Dim state as MyObjectState = CType(e.UserState, MyObjectState)
    'You can now use the state object with any of the instance information you need
    'At this point message would be "blah blah blah"

End Sub

这基本上就像一个“快照”,所以我会让你的状态对象尽可能详细,但只传输你需要的东西。

于 2013-04-04T16:03:39.150 回答
1

ReportProgress事件有一个接受两个参数的重载。
第一个是您在 ProgressPercentage 属性中获得的百分比。
第二个是您从 ObjectState 属性中获取的对象

所以你可以像这样创建一个迷你类

Public Class bwObjectState
    Public String Details
End Class

然后当你调用 ReportProgress

Dim data As new bwObjectState()
data.Details = "Textbox details will go here"
progress = (100 / (UBound(servers) + 1)) * (i + 1)
bw.ReportProgress(progress, data)

如果您打算传递其他值,则类对象很有用,但如果您只需要传递一个字符串,您可以简单地将字符串分配给第二个参数

bw.ReportProgress(progress, "Textbox details will go here")

当然,在 ProgressChanged 事件中,您需要将 ObjectState 对象转换回其原始类型

Dim data  as bwObjectState = CType(e.UserState, bwObjectState)

或者干脆

Dim details  as String = CType(e.UserState, String)
于 2013-04-04T16:04:47.433 回答