如何将多个变量传递给bw_ProgressChanged函数

时间:2013-04-04 15:56:54

标签: vb.net function variables

我有一个小的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

2 个答案:

答案 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)