开发者

Calling Sub from EventHandler

开发者 https://www.devze.com 2023-01-03 03:09 出处:网络
I\'m using the below to update controls from another thread (works great) How would I call a Sub (Named UpdateList)? The UpdateList updates a listview with a list of databases on a selected SQL instan

I'm using the below to update controls from another thread (works great) How would I call a Sub (Named UpdateList)? The UpdateList updates a listview with a list of databases on a selected SQL instance, requires no arguments.

Private Sub CompleteEventHandler(ByVal sender As Object, ByVal e As Microsoft.SqlServer.Management.Common.ServerMessageEventArgs)
    SetControlPropertyValue(Label8, "text", e.ToString)

    UpdateList()

    MessageBox.Show("Restore Complete")
End Sub

Delegate Sub SetControlValueCallback(ByVal oControl As Control, ByVal propName As String, ByVal propValue As Object)

Private Sub SetControlPropertyValue(ByVal oControl As Control, ByVal propName As String, ByVal propValue As Object)
    If (oControl.InvokeRequired) Then

        Dim d As New SetControlValueCallback(AddressOf SetControlPropertyValue)
        oControl.Invoke(d, New Object() {oControl, propName, propValue})
    Else
        Dim t As Type = oControl.[GetType]()
       开发者_如何学运维 Dim props As PropertyInfo() = t.GetProperties()
        For Each p As PropertyInfo In props
            If p.Name.ToUpper() = propName.ToUpper() Then
                p.SetValue(oControl, propValue, Nothing)
            End If
        Next

    End If

End Sub

Based On: http://www.shabdar.org/cross-thread-operation-not-valid.html


Calling a method from an event handler is not a special case – use a normal call.

The issue here is the cross-thread call from a background thread to the GUI thread. In order to overcome it, you can place the following code at the beginning of the UpdateList code:

If Me.InvokeRequired Then
    Me.Invoke(New Action(AddressOf UpdateList))
    Return
End If
0

精彩评论

暂无评论...
验证码 换一张
取 消