2013-04-04 58 views
0

我有一个小的VB.Net程序,它显示了一个进度窗体。在该框中,我会在文本框中显示一个进度栏和一个完整的百分比。这些都可以由一个整数派生,但现在我已经被要求在进度窗体上放置一个'详细信息'文本框,该文本框用文本更新以显示工作如何进行。如何将多个变量传递给bw_ProgressChanged函数

我的问题 - 如何将百分比和文字细节都传递给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 

回答

1

,最好的办法是创建自己的自定义“status”对象,其中包含要传递给正在处理进度更改的所有数据。然后,将其作为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 

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

+0

感谢您的答复,但我发现一个错误。在'bw_ProgressChanged()'函数中,它告诉我'确保源类型可以转换为目标类型,并指向'Dim state ...'行。任何想法呢? – 2013-04-04 16:30:25

+0

不要紧,我知道了 - 我包含了你的'bw_ReportProgress()'行,但那当然已经在我的代码中,并且包含它两次(一次在错误的地方!)是我的问题的原因。谢谢您的帮助。 – 2013-04-04 16:39:42

+0

@DavidGard:Woops,对不起,我没有回应,我只是现在刚刚得到你的评论:) – 2013-04-04 17:33:18

1

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

所以,你可以创建一个这样

Public Class bwObjectState 
    Public String Details 
End Class 

一个miniclass然后当你调用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)