2013-09-12 4 views
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 
+0

На первый взгляд похоже, что поток управления здесь очень сломан. Когда условие истинно, вы хотите, чтобы элемент управления перешел в оператор 'Next', хотя цикл никогда не запускался? Считаю, что лучшим решением здесь было бы не использовать GoTo. – David

+0

цикл for был запущен! каждая часть находится в другой функции – User7291

+0

Не в соответствии с кодом, размещенным в вопросе. Мы можем помочь только с кодом, который вы нам показываете, а не с кодом, который вы храните где-то в другом месте. – David

ответ

1

я упускаю что-то?

думаю. A) Вы не можете GOTO точки в другой процедуре и B) ее плохая идея, чтобы GOTO место в другом цикле (если оно даже законно). C) Он также показывает, что вы используете таймер в качестве средства управления контуром, а D) расположение метки NEXTRECORD указывает на то, что вы пытаетесь выполнить GOTO/CALL/jump в цикл внутри процедуры события.

Изменить sendSched() на функцию с возвратом True/False в зависимости от того, отправлять или нет (очень похоже на ответ Дугласа).

Затем выпотрошить 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 (sender и e), чтобы точно знать, какую вещь обрабатывать (при условии, что это законное событие, а не то, что вы стреляете в код.)

Возможно, вам также потребуется изучить .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... пропустить те, которые уже отправлены.

HTH

+0

вы не понимаете! проблема в том, что когда таймер заканчивает задание и выходит из подпрограммы, он не возвращается в цикл for, чтобы продолжить следующую строку, даже если я делаю тест на timesend – User7291

+0

. Большие точки находятся в ABCD: вы НЕ МОЖЕТЕ выполнять многие из вещи, которые вы пытаетесь сделать. Допустимое использование таймера - это запуск задачи, а не продолжение цикла в какой-либо другой процедуре. – Plutonix

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 
+0

Я обновил свой код, вы можете проверить его сейчас для меня. plz – User7291

Смежные вопросы