我有一个小的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
答案 0 :(得分: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
这基本上就像一个“快照”,所以我会尽可能详细地说明你的状态对象,但只传输你需要的东西。
答案 1 :(得分: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)