K3JAE Ответов: 2

Прервать перемещение записи или сохранение, если ТБ пуст


Я постараюсь быть как можно более ясным.

У меня есть много текстовых полей (tb) в моей форме, которые заполняются импортом CSV-файла. Перед тем как запись может быть сохранена любым способом (нажатие кнопки Сохранить, переход к другой записи, добавление новой записи, закрытие программы) Я пытаюсь обеспечить заполнение конкретных полей ТБ.

У меня есть "грязная" команда (код ниже), чтобы отметить, если что-то изменится в записи, и если да, то попросит пользователя сохранить или отменить сохранение перед переходом к следующей записи (будь то вперед или назад, добавление новой записи или закрытие программы). "Грязный" вызывается независимо от того, какой метод использует пользователь для перехода к другой записи, добавления записи или просто пытается закрыть программу без сохранения.

С измененным" грязным " кодом ниже он проверяет и запрашивает меня, если в текстовом поле отсутствуют данные... но как только пользователь нажимает кнопку ОК, он продолжает спрашивать, хочу ли я сохранить запись (даже если я отменю сохранение), а затем переходит к запрошенной записи или добавляет, что бы я ни выбрал во время тестирования.

Я хочу, чтобы программа остановилась там и оставалась на записи до тех пор, пока пользователь не исправит "ошибку". чем запускает грязную и перемещает, добавляет запись или закрывает программу, предполагая, что никакие другие необходимые ТБ не являются нулевыми/пустыми.

Пример моего кода импорта выглядит следующим образом:
tbCarrierLoadNumber.Text = MyList.Items.Item(288).ToString


Мой импорт работает нормально. Я думал, что смогу разместить следующее (заменив ту же строку импорта выше), но это, похоже, тоже не работает, давая ошибки до того, как форма даже загрузится:

If (String.IsNullOrEmpty(tbCarrierLoadNumber.Text)) Then
                MsgBox("Carrier Load Number is Required." & vbNewLine & "Please Correct.", MsgBoxStyle.Exclamation, "OVERSIGHT ERROR")
else
tbCarrierLoadNumber.Text = MyList.Items.Item(288).ToString
end if


Если я правильно понимаю, что он проверяет флажок перед импортом, так что, очевидно, msgbox появится перед импортом. Мне нужно, чтобы это произошло после импорта и до или во время "грязного" события, и я не знаю, как это сделать.

Поскольку это, по-видимому, не работает, я вернулся к своей первоначальной строке импорта и изменил свой "грязный" код следующим образом (Пожалуйста, смотрите дополнительную информацию в конце грязного кода):

Что я уже пробовал:

Private Sub Dirty()
    If Not LoadForm Then
        Cursor = Cursors.WaitCursor

        If (String.IsNullOrEmpty(dpDispatchDate.Text)) Then
            MsgBox("Dispatch Date cannot by blank." & vbNewLine & "Please Correct.", MsgBoxStyle.Critical, "OVERSIGHT ERROR")
            Return
        End If
        If (String.IsNullOrEmpty(tbCarrierLoadNumber.Text)) Then
            MsgBox("Carrier Load Number is Required." & vbNewLine & "Please Correct.", MsgBoxStyle.Exclamation, "OVERSIGHT ERROR")
            Return
        End If
        If (String.IsNullOrEmpty(tb01Time.Text)) Then
            MsgBox("01 Pickup Date/Time cannot by blank." & vbNewLine & "Please Correct.", MsgBoxStyle.Critical, "OVERSIGHT ERROR")
            Return
        End If
        If (String.IsNullOrEmpty(tb90Time.Text)) Then
            MsgBox("90 Pickup Date/Time cannot by blank." & vbNewLine & "Please Correct.", MsgBoxStyle.Critical, "OVERSIGHT ERROR")
            Return
        End If
        If (String.IsNullOrEmpty(tbShipCode.Text)) Then
            MsgBox("A Shipper Code is Required - Cannot by blank." & vbNewLine & "PPlease Correct.", MsgBoxStyle.Exclamation, "OVERSIGHT ERROR")
            Return
        End If
        If (String.IsNullOrEmpty(tbRcvrCode.Text)) Then
            MsgBox("A Receiver Code is Required - Cannot by blank." & vbNewLine & "Please Correct.", MsgBoxStyle.Exclamation, "OVERSIGHT ERROR")
            Return
        End If
        If (String.IsNullOrEmpty(tbLinehaulToTruck.Text)) Then
            MsgBox("Linehaul to Truck cannot by blank." & vbNewLine & "Please Correct.", MsgBoxStyle.Critical, "OVERSIGHT ERROR")
            Return
        End If
        If (String.IsNullOrEmpty(tbLinehaulToFax.Text)) Then
            MsgBox("Linehaul to Fax cannot by blank." & vbNewLine & "Please Correct.", MsgBoxStyle.Critical, "OVERSIGHT ERROR")
            Return
        End If
        If (String.IsNullOrEmpty(tbNumPU.Text)) Then
            MsgBox("Number of Pickups cannot by blank." & vbNewLine & "Please Enter Number of Pickups.", MsgBoxStyle.Exclamation, "OVERSIGHT ERROR")
            Return
        End If
        If (String.IsNullOrEmpty(tbNumbDrops.Text)) Then
            MsgBox("Number of Drops cannot by blank." & vbNewLine & "Please Enter Number of Drops.", MsgBoxStyle.Exclamation, "OVERSIGHT ERROR")
            Return
        End If

        Validate()
        LoadInfoDataSetBindingSource.EndEdit()
        If LoadInfoDataSet.HasChanges Then
            MeMsgBoxSaveChanges.ShowDialog()
            If MeMsgBoxSaveChanges.Result = "Yes" Then
                btnSaveNav.PerformClick()
            Else
                LoadInfoDataSet.RejectChanges()
            End If
        End If
        Cursor = Cursors.Default
    End If
End Sub


Я также попытался заменить вышеприведенное "return "на" exit sub " без каких-либо изменений в поведении.

2 Ответов

Рейтинг:
2

MCSIDevelopers

Ну, я не уверен на 100%, что проясню вашу проблему. Но мне кажется, что у вас есть много проверок, которые нужно пройти, прежде чем данные будут сохранены. С этим и по взгляду на ваш последний код Dirty Что я думаю, что вам нужно, так это то, что вам нужно использовать

If...Else...End If
оператор и после или под каждой пойманной ошибкой попытайтесь увидеть, была ли ошибка разрешена или нет, если нет, то сломайте процесс, чтобы он не продолжал выполнять другие коды, которые в конце концов выполнят оператор insert/update, который даст вам проблемы.

Вы упускаете Else в вашем коде.

Чтобы разбить это на простом английском.

1. Используйте Else
2. под каждой ошибкой сделайте проверку, которая проверит, исправил ли пользователь ошибку. Если нет, вам придется решить, как долго вы будете держать свой цикл запущенным, прежде чем отменить весь процесс или временно сохранить его в другом месте как незавершенную задачу
3.Если вы поймали ошибку, не просто выводите сообщение об ошибке, а после отображения ошибки попробуйте поработать с ней или укажите пользователю, где произошла ошибка.

Кроме того, еще одно решение, которое я думаю, вы можете нам предложить, так как вы просто возвращаетесь после каждой ошибки в ловушке, то, что вы можете сделать, это для каждой ошибки установить свой возврат в False, чтобы вы знали, что произошла ошибка, и вы будете знать, что не нужно сохранять эти данные. Вам нужно будет в конце проверить return, если он истинен или ложен, но имейте в виду, что вы можете создать свои собственные переменные, которые вы сначала проверите, потому что Return будет перезаписан следующей проверкой, но просто используя это
If (Your statement) Then
....
Else
....
End If
я просто помогу тебе.


CHill60

В этом нет необходимости Else - у ОП есть заявление о возврате.
"как долго вы будете держать свою петлю запущенной" - какая петля. Это пользователь должен решить, когда ему хватит, а не разработчик.

[no name]

Проблема в коде OP заключается в том, что s/he разделил операторы, поэтому даже если другая ошибка была поймана в ловушку, отладка все равно будет продолжаться со следующей отладкой/чтением кода. Если OP использовал Else, когда ошибка была поймана в ловушку, OP может иметь контроль над тем, что может произойти дальше после того, как ошибка была поймана и сообщение было отображено пользователю. Взгляните на это:

Дим с, как целое

c = c +1
Если c < 5, то
c = c +1
Ещё
Если c = 5, то
- Покажите сообщение и остановитесь.
Конец, если

Приведенный выше код поможет иметь контроль над следующим кодом.

Дим с, как целое

c = c +1
Если c < 5, то
c = c +1
Конец, Если

Если c = 5, то
"Показать сообщение здесь
Конец, Если

Теперь, если бы у меня был еще один оператор If здесь, система также прочитала бы его, что и говорит OP.

Посмотрите очень внимательно на код операции, и вы поймете, что я имею в виду.

Рейтинг:
0

CHill60

Попробуйте изменить свою логику, чтобы иметь следующее:

- Кнопка, которая запускает загрузку из CSV-файла - это должно загрузить файл и заполнить ваши текстовые поля первой строкой.

- Каждая кнопка (Я думаю) для следующей записи, предыдущей записи.

- Кнопка для сохранения записи и кнопка для сохранения файла (и выхода) и еще одна для отмены (и выхода)

Нажатие кнопки next или previous должно просто отображать следующую / предыдущую запись. Было бы очень хорошо, если бы вы выделили какие-либо проблемные данные для пользователя при загрузке каждой строки.
Если вы действительно хотите, вы можете проверить, были ли сделаны какие-либо обновления до того, как Save Record обновит базовые данные.
Кнопка Сохранить файл должна проверить весь набор данных, возможно, перед сохранением - хотя пользователь может захотеть сохранить его наполовину ... и идем обедать : -). Вам нужно будет подумать о том, как отметить, что файл полностью завершен.

Некоторые особенности
- Не загружайте файл в форму загрузки.
- При проверке текстовых полей проверьте их все и дайте пользователю полный список ошибок в одном сообщении - или установите цвет оскорбительных текстовых полей на другой цвет, или и то, и другое.
- Разбейте свою функциональность на более мелкие процедуры - Процедура проверки текстовых полей может вернуть список неисправных элементов управления, например
- Не следуйте советам в решении 1