Проверка того, является ли поле пустым, происходит в событии RowPersisting в PXDefaultAttribute. Проверка наличия ошибок на экране происходит в событии CommandPreparing в PXUIFieldAttribute.
Поскольку вы на самом деле не сохраняете, было бы проще повторить проверку, а не пытаться ее «запустить». Следующий фрагмент кода пытается повторить проверку путем проверки каждой записи в кэше для каждого представления на графике.
public static void Validate(PXGraph graph)
{
for (int k = 0; k < graph.Views.Caches.Count; ++k)
{
PXCache cache = graph.Caches[graph.Views.Caches[k]];
PXEntryStatus status;
foreach (object rec in cache.Cached)
{
status = cache.GetStatus(rec);
if (cache.GetStatus(rec) == PXEntryStatus.Updated || cache.GetStatus(rec) == PXEntryStatus.Inserted)
{
cache.Current = rec;
foreach (PXDefaultAttribute attribute in cache.GetAttributesReadonly(rec, null).OfType<PXDefaultAttribute>())
{
CheckDefaultAttribute(attribute.PersistingCheck, attribute.FieldName, rec, cache);
}
foreach (PXDBDefaultAttribute attribute in cache.GetAttributesReadonly(rec, null).OfType<PXDBDefaultAttribute>())
{
CheckDefaultAttribute(attribute.PersistingCheck, attribute.FieldName, rec, cache);
}
// Verifies that there are no errors on the page.
foreach (IPXInterfaceField field in cache.GetAttributesReadonly(rec, null).OfType<IPXInterfaceField>())
{
if (!string.IsNullOrEmpty(field.ErrorText) && (field.ErrorLevel == PXErrorLevel.Error || field.ErrorLevel == PXErrorLevel.RowError))
{
throw new PXException(field.ErrorText);
}
}
}
}
}
}
// Verifies that the field has a value if the PersistingCheck is not PXPersistingCheck.Nothing
protected static void CheckDefaultAttribute(PXPersistingCheck persistingCheck, string fieldName, object row, PXCache cache)
{
if (persistingCheck != PXPersistingCheck.Nothing)
{
object value = cache.GetValue(row, fieldName);
if (value == null || (persistingCheck == PXPersistingCheck.NullOrBlank && value is string && ((string)value).Trim() == string.Empty))
{
throw new PXException(ErrorMessages.FieldIsEmpty, PXUIFieldAttribute.GetDisplayName(cache, fieldName));
}
}
}
Как отказ от ответственности, эта методология пропустит любую проверку, которая произойдет в пользовательском событии RowPersisting.