Отмена события RowInserting сбрасывает поля в строке

В моем приложении acumatica я создал настраиваемую страницу, на которой пользователю нужно вставить данные в раздел сетки. Чтобы проверить предоставленные данные, я реализовал события RowInserting и RowUpdating.

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

cache.RaiseExceptionHandling<DZField.size>(fieldLine, fieldLine.Size,
    new PXSetPropertyException(string.Format(ValidationMessages.FIELD_NOT_VALID_FORMAT, 
        "Size"), PXErrorLevel.RowError));

Затем я устанавливаю для свойства e.Cancel значение true. Но когда пользователь изменяет неправильное значение и повторно запускает событие, в строке будут отсутствовать значения, которые не были обработаны в событии.

Я также пытался не устанавливать свойство e.Cancel и вместо этого генерировать исключение PXException, но даже в этом случае другие значения в строке были сброшены.


person Jean Claude Abela    schedule 04.07.2017    source источник


Ответы (1)


В вашем событии RowInserting вы не выдаете ошибку, вы ее повышаете.

Из документации обработчик событий RowInserting используется для:

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

Если вы используете синтаксис throw в событии вставки строки, появится всплывающее окно с сообщением об ошибке, и запись не будет видна в сетке. Вы не должны использовать e.Cancel для проверок в RowInserting.

Пример отмены вставки:

protected virtual void DACName_RowInserting(PXCache sender, 
                                            PXRowInsertingEventArgs e)
{
    throw new PXException(ErrorMessages.FieldIsEmpty, 
                          typeof(PaymentMethodAccount.paymentMethodID).Name);
}

Источник: RowInserting Event

Что касается обновления строки, использование e.Cancel для проверки отменит обновление всех полей, которые помечены как грязные для этой строки. Иногда это то, чего вы хотите, но, судя по вашему вопросу, я думаю, что этого следует избегать.

При проверке отдельных полей вы можете использовать событие обновления поля, которое не повлияет на другие поля и не вызовет исключения полей. Выдача ошибки в событии строки или установка e.Cancel в событии строки повлияет на всю строку.

person Hugues Beauséjour    schedule 04.07.2017