VB.NET与代理错误思想

VB.NET与代理错误思想,vb.net,datagridview,delegates,thread-safety,Vb.net,Datagridview,Delegates,Thread Safety,我通过comport发送和接收状态号,这很好。如果我发送了一个新的状态,我就实现了一个datagridview,它也可以像我希望的那样工作,所以算法应该是正确的 另一种方式是,我还接收状态号,在数据库中写入新的状态号,然后实现datagridview。问题就在这里 com端口接收方法位于自己的模块中。它调用位于表单类中的子“Empfangen”。此子项Empfangen()提取收到的状态号和其他信息,经过测试,工作正常。之后,我调用一个子statusAnzegen\u DataGridViewM

我通过comport发送和接收状态号,这很好。如果我发送了一个新的状态,我就实现了一个datagridview,它也可以像我希望的那样工作,所以算法应该是正确的

另一种方式是,我还接收状态号,在数据库中写入新的状态号,然后实现datagridview。问题就在这里

com端口接收方法位于自己的模块中。它调用位于表单类中的子“Empfangen”。此子项
Empfangen()
提取收到的状态号和其他信息,经过测试,工作正常。之后,我调用一个子
statusAnzegen\u DataGridViewMA()
,它将datagridview中的颜色更改为新状态。这一定是问题所在,
datagridview.rowcount
告诉我这里有4行

所以我的想法是,使用委托

我宣布下列代表:

Public Delegate Sub StatusAnzeigen_DataGridViewMADelegate(ByVal msg As String)
这里是颜色变化代码的一部分(记住,如果我发送状态,它会起作用)

它从不使用invokerequired=true

我有两个问题,这个想法正确吗?线有问题吗? 如果是的话,我的错误在哪里,可能是实施的地方错了

我第一次试过这个,我真的很想帮忙

***由于孔图片的问题而编辑:

这是我的COM接收例程:

Public Sub MSCom_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles MSCom.DataReceived
    Dim buffer As Object
    Dim count As Integer
    buffer = ""
    count = 1
    Do
        Try
            buffer = CStr(MSCom.ReadLine)           ' Receive the data 
            Debug.Print("buffer: " & buffer)
            If (InStrRev(buffer, ": 13")) > 0 Then
                message = message + buffer
                buffer = ""
            End If
            If Len(message) > 0 And InStrRev(buffer, "84") Then
                buffer = message + buffer
                message = ""
            End If

        Catch ex As Exception
            buffer = ex.Message        ' Exception handling 
            Exit Sub
        End Try
    Loop Until (InStrRev(buffer, ": 13") > 0 Or InStrRev(buffer, ": 12") > 0 Or InStrRev(buffer, "AFF") > 0)
    If (InStrRev(buffer, ": 13") > 0 Or InStrRev(buffer, ": 12") > 0 Or InStrRev(buffer, "AFF") > 0) Then

        Form_Dashboard.Empfangen(buffer)
    End If
End Sub
下面的代码是我的子Empfangen,它从收到的字符串中提取数字、状态等

    Public Sub Empfangen(ByVal msg As String)
    On Error Resume Next

    Dim pos As Integer
    Dim pos1 As Integer
    Dim anrufer As String           'Rufnummer des Anrufers
    Dim anruferdez As Integer
    Dim hexStatus As String
    Dim decstatus As Integer
    Dim Statusstring As String
    Dim strT As String
    Dim typ As Integer
    Dim test As String
    Dim test1 As String
    strInput = ""

    If Len(msg) > 1 Then

        pos = InStrRev(strInput, db.eigeneRNR)
        pos1 = InStrRev(strInput, ": 13")
        test = Mid(strInput, 14, 7)       'Rufnummer sender
        test1 = Mid(strInput, pos + 10, 4)      'Status
        '-----------Status Eingang einfach-------------------------------------------
        If (pos > 0 And pos1 > 0) Then
            ' Anrufer und hexstatus aus strInput herauskopieren
            anrufer = Mid(strInput, 13, 7) ' 6 Stellen der Teilnehmernummer des Anrufers
            hexStatus = "&H" & Mid(msg, 36, Len(msg)) ' Status als Hexzahl
            If Microsoft.VisualBasic.Strings.Right(hexStatus, 3) <> "AFF" Then ' Wenn Adressat nicht ausgeschaltet 4AFF oder 5AFF
                ' 
                hexStatus = Microsoft.VisualBasic.Strings.Right(hexStatus, 5)
                hexStatus = Microsoft.VisualBasic.Strings.Left(hexStatus, 4)
                decstatus = CLng("&H" & hexStatus)   ' umwandeln in Dezimalzahl (Integer)
                decstatus = db.FindeTNStatusNr(decstatus)
                anruferdez = db.FindeTNPK(anrufer)
                db.Schreibe_StatusTN(anruferdez, decstatus, 1)     'Prüfen, ob Decstatus integer ist


                StatusAnzeigen_DataGridViewMA()

            Else
                decstatus = 98      'TN ausgeschaltet
                db.Schreibe_StatusTN(anrufer, decstatus, 1)
                StatusAnzeigen_DataGridViewMA()
            End If
        End If
        pos1 = InStrRev(strInput, ": 12")
        '-----------Status Eingang Quittung-------------------------------------------
        If (pos > 0 And pos1 > 0) Then
            'hexStatus = Microsoft.VisualBasic.Strings.Right(hexStatus, 5)
            'hexStatus = Microsoft.VisualBasic.Strings.Left(hexStatus, 4)
            anrufer = Mid(strInput, 13, 7) ' 6 Stellen der Teilnehmernummer des Anrufers
            If Microsoft.VisualBasic.Strings.Right(msg, 3) <> "AFF" Then ' Wenn Adressat nicht ausgeschaltet 4AFF oder 5AFF
                ' Anrufer und hexstatus aus strInput herauskopieren
                decstatus = 99
                db.Schreibe_StatusTN(anrufer, decstatus, 1)     'Prüfen, ob Decstatus integer ist
            Else
                decstatus = 98  ''TN ausgeschaltet
                db.Schreibe_StatusTN(anrufer, decstatus, 1)

            End If
            StatusAnzeigen_DataGridViewMA()
        End If
        strInput = ""


    End If
End Sub
Public Sub Empfangen(ByVal msg作为字符串)
出错时继续下一步
作为整数的Dim pos
作为整数的Dim pos1
Dim anrufer作为字符串“Rufnummer des anrufer”
Dim anruferdez作为整数
将状态设置为字符串
将状态设置为整数
将状态字符串设置为字符串
作为字符串的Dim strT
作为整数的Dim类型
作为字符串的Dim测试
将test1设置为字符串
strInput=“”
如果Len(msg)>1,则
位置=仪表(输入,分贝)
位置1=仪表板(划线,“:13”)
测试=中间(strInput,14,7)'Rufnummer发送器
测试1=中间(strInput,位置+10,4)状态
'------------状态Eingang einfach-------------------------------------------
如果(位置>0和位置1>0),则
“安鲁弗和赫拉斯科皮耶伦的地位
安鲁费尔=安鲁费尔中段(strInput,13,7)'6
hexStatus=“&H”&Mid(msg,36,Len(msg))”状态als Hexzahl
如果Microsoft.VisualBasic.Strings.Right(hexStatus,3)“AFF”,则“Wenn address nicht ausgeschaltet 4AFF order 5AFF”
' 
hexStatus=Microsoft.VisualBasic.Strings.Right(hexStatus,5)
hexStatus=Microsoft.VisualBasic.Strings.Left(hexStatus,4)
decstatus=CLng(“&H”和hexStatus)”在Dezimalzahl中的umwandeln(整数)
decstatus=db.findetnstatunr(decstatus)
anruferdez=db.FindeTNPK(anrufer)
db.Schreibe_StatusTN(anruferdez,decstatus,1)'Prüfen,ob decstatus整数列表
StatusAnzigen_DataGridViewMA()
其他的
decstatus=98'TN ausgeschaltet
db.Schreibe_Status TN(安鲁费尔,decstatus,1)
StatusAnzigen_DataGridViewMA()
如果结束
如果结束
位置1=仪表板(划线,“:12”)
'------------状态Eingang Quitung-------------------------------------------
如果(位置>0和位置1>0),则
'hexStatus=Microsoft.VisualBasic.Strings.Right(hexStatus,5)
'hexStatus=Microsoft.VisualBasic.Strings.Left(hexStatus,4)
安鲁费尔=安鲁费尔中段(strInput,13,7)'6
如果Microsoft.VisualBasic.Strings.Right(msg,3)“AFF”,则“winn address nicht ausgeschaltet 4AFF order 5AFF”
“安鲁弗和赫拉斯科皮耶伦的地位
decstatus=99
db.Schreibe_StatusTN(anrufer,decstatus,1)“Prüfen,ob decstatus整数列表
其他的
decstatus=98''TN ausgeschaltet
db.Schreibe_Status TN(安鲁费尔,decstatus,1)
如果结束
StatusAnzigen_DataGridViewMA()
如果结束
strInput=“”
如果结束
端接头

这是所有功能验证,数据库中的状态更改。只有datagridview没有实现

这可能与您的问题有关:
错误时继续下一步
。这是遗留的VisualBasic代码(从VB6和更早版本开始),它的存在只是为了向后兼容。让错误被抛出,这样调试器就可以捕捉到它们,或者至少使用一个,但是,请考虑使用AN来让事情变得更容易。注释GotoStutsAsZeNigNoDATAGIDVIEWMAYR Error <代码>表明,已有错误处理代码可以转换为<代码> catch <代码> Bug。该位置和实现是否正确?您是否也认为recordcount传递的记录数量错误是线程问题?我现在对错误处理进行了评论,所以它消失了;-)我习惯于VBA,我一直认为try..catch来自CTH这可能与您的问题有关:
出错时继续下一步
。这是遗留的VisualBasic代码(从VB6和更早版本开始),它的存在只是为了向后兼容。让错误被抛出,这样调试器就可以捕捉到它们,或者至少使用一个,但是,请考虑使用AN来让事情变得更容易。注释GotoStutsAsZeNigNoDATAGIDVIEWMAYR Error <代码>表明,已有错误处理代码可以转换为<代码> catch <代码> Bug。该位置和实现是否正确?您是否也认为recordcount传递的记录数量错误是线程问题?我对错误进行了注释
    Public Sub Empfangen(ByVal msg As String)
    On Error Resume Next

    Dim pos As Integer
    Dim pos1 As Integer
    Dim anrufer As String           'Rufnummer des Anrufers
    Dim anruferdez As Integer
    Dim hexStatus As String
    Dim decstatus As Integer
    Dim Statusstring As String
    Dim strT As String
    Dim typ As Integer
    Dim test As String
    Dim test1 As String
    strInput = ""

    If Len(msg) > 1 Then

        pos = InStrRev(strInput, db.eigeneRNR)
        pos1 = InStrRev(strInput, ": 13")
        test = Mid(strInput, 14, 7)       'Rufnummer sender
        test1 = Mid(strInput, pos + 10, 4)      'Status
        '-----------Status Eingang einfach-------------------------------------------
        If (pos > 0 And pos1 > 0) Then
            ' Anrufer und hexstatus aus strInput herauskopieren
            anrufer = Mid(strInput, 13, 7) ' 6 Stellen der Teilnehmernummer des Anrufers
            hexStatus = "&H" & Mid(msg, 36, Len(msg)) ' Status als Hexzahl
            If Microsoft.VisualBasic.Strings.Right(hexStatus, 3) <> "AFF" Then ' Wenn Adressat nicht ausgeschaltet 4AFF oder 5AFF
                ' 
                hexStatus = Microsoft.VisualBasic.Strings.Right(hexStatus, 5)
                hexStatus = Microsoft.VisualBasic.Strings.Left(hexStatus, 4)
                decstatus = CLng("&H" & hexStatus)   ' umwandeln in Dezimalzahl (Integer)
                decstatus = db.FindeTNStatusNr(decstatus)
                anruferdez = db.FindeTNPK(anrufer)
                db.Schreibe_StatusTN(anruferdez, decstatus, 1)     'Prüfen, ob Decstatus integer ist


                StatusAnzeigen_DataGridViewMA()

            Else
                decstatus = 98      'TN ausgeschaltet
                db.Schreibe_StatusTN(anrufer, decstatus, 1)
                StatusAnzeigen_DataGridViewMA()
            End If
        End If
        pos1 = InStrRev(strInput, ": 12")
        '-----------Status Eingang Quittung-------------------------------------------
        If (pos > 0 And pos1 > 0) Then
            'hexStatus = Microsoft.VisualBasic.Strings.Right(hexStatus, 5)
            'hexStatus = Microsoft.VisualBasic.Strings.Left(hexStatus, 4)
            anrufer = Mid(strInput, 13, 7) ' 6 Stellen der Teilnehmernummer des Anrufers
            If Microsoft.VisualBasic.Strings.Right(msg, 3) <> "AFF" Then ' Wenn Adressat nicht ausgeschaltet 4AFF oder 5AFF
                ' Anrufer und hexstatus aus strInput herauskopieren
                decstatus = 99
                db.Schreibe_StatusTN(anrufer, decstatus, 1)     'Prüfen, ob Decstatus integer ist
            Else
                decstatus = 98  ''TN ausgeschaltet
                db.Schreibe_StatusTN(anrufer, decstatus, 1)

            End If
            StatusAnzeigen_DataGridViewMA()
        End If
        strInput = ""


    End If
End Sub