0

我有这个代码我正在使用 goto 选项我总是得到标签 nextrecord 没有定义.. 我该怎么办?我错过了什么吗?你能告诉我我什么时候做吗:)提前谢谢你!这就是我正在写的代码..

Private Sub Timer_Tick(sender As System.Object, e As System.EventArgs) Handles Timer.Tick
    Try
        Timer.Interval = 5000
        sendSched()
        If send = True Then
            GoTo NEXTRECORD
        End If
    Catch
    End Try
End Sub 

Private Sub sendSched()
    subTable.Rows.Clear()
    subTable = selectSubscriber(content.mt, content.clID)
    subCount = subTable.Rows.Count()
    If content.timeSend = DateTime.Now.ToString("hh:mm") Then
        Timer.Enabled = False
        UpdateListBoxRec2("Sending content: " & content.contentSend & " to :")
        For Each subRow As DataRow In subTable.Rows
            content.moSend = subRow("sim_mo")
            UpdateListBoxRec2(content.moSend)
            MsgBox(content.contentSend)
        Next
        send = True
    Else
        Timer.Enabled = True
        Timer.Interval = 5000
    End If
End Sub

Private Sub start_check_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles start_check.CheckedChanged
  For Each contentRow As DataRow In contentTable.Rows
            content.mt = contentRow("cnt_mt")
            content.clID = contentRow("cnt_cl_id")
            content.contentSend = contentRow("cnt_content")
            content.id = contentRow("cnt_id")
            content.timeSend = contentRow("cnt_time_to_send")
            UpdateListBoxRec("Content to send at: " & content.timeSend)
            Timer.Enabled = True
            Timer.Interval = 0
NEXTRECORD:
   Next
End Sub
4

2 回答 2

1

我错过了什么吗?

我认同。A)您不能在不同的程序中转到某个点,并且 B)转到另一个循环内的某个位置是个坏主意(如果它甚至是合法的)。C)您似乎还使用计时器作为循环控制装置,并且 D)NEXTRECORD 标签的位置似乎表明您正在尝试 GOTO/CALL/跳转到事件过程中的循环。

将 sendSched() 更改为返回 True/False 的函数,具体取决于是否发送(非常类似于 Douglas 的回答)。

然后将 start_check_CheckedChanged 插入一个包含该代码的新过程,例如:

Private Sub AddContent
   For Each contentRow As DataRow In contentTable.Rows
    ...
    ...
   Next
End Sub

现在,您可以根据需要从事件过程中调用它和/或从 Timer_Tick 事件中调用它,并消除 GOTO 和发送全局/模块标志变量。

看起来您可能一直在尝试使用 GOTO 来避免重新处理其中的内容start_check_CheckedChanged(即使每次处理时都会清除某些内容subTables.Rows.Clear)。首先,当您可能能够检查事件 args (sendere) 以准确知道要处理的事情时,您正在迭代事件中的所有行(前提是它是合法事件而不是您在代码中触发的事情。)

您可能还需要检查 .timesend 以确定该数据包(或其他数据包)是否已发送。就像是:

For Each contentRow As DataRow In contentTable.Rows
    If content.timesend <> String.Empty Then   ' or <> DateTime.Now.MinValue.ToString
    ...
    ' process or send it
    ...
    End If
Next

或者,由于它看起来像是content您设计的,您可以Sent在发送每个项目后添加一个您设置的标志,并使用它If content.Sent = False Then...来跳过已经发送的那些。

高温高压

于 2013-09-12T17:23:42.680 回答
0

这应该完全重写。目前尚不清楚您要在这里做什么,但试试这个:

If Not send  Then
  For Each contentRow As DataRow In contentTable.Rows
            content.mt = contentRow("cnt_mt")
            content.clID = contentRow("cnt_cl_id")
            content.contentSend = contentRow("cnt_content")
            content.id = contentRow("cnt_id")
            content.timeSend = contentRow("cnt_time_to_send")
            UpdateListBoxRec("Content to send at: " & content.timeSend)
            Timer.Enabled = True
            Timer.Interval = 0
   Next
End If
于 2013-09-12T14:39:21.567 回答