Почему бы не вырваться из петли, так что он перестает проверять?
public void BeforeSave(BCE.AutoCount.Invoicing.Sales.SalesOrder.SalesOrderBeforeSaveEventArgs e)
{
for (int i = 0; i < e.MasterRecord.DetailCount; i++)
{
if (String.IsNullOrEmpty(e.MasterRecord.GetDetailRecord(i).YourPONo.ToString()))
{
MessageBox.Show("You left Your PO No empty. Please check it carefully.");
break; // <--
}
}
}
return
также будет работать в этой ситуации.
Test, если BeforeSave
работает дважды:
public void BeforeSave(BCE.AutoCount.Invoicing.Sales.SalesOrder.SalesOrderBeforeSaveEventArgs e)
{
MessageBox.Show("Test"); // <--
for (int i = 0; i < e.MasterRecord.DetailCount; i++)
{
if (String.IsNullOrEmpty(e.MasterRecord.GetDetailRecord(i).YourPONo.ToString()))
{
MessageBox.Show("You left Your PO No empty. Please check it carefully.");
break; // <--
}
}
}
Как то вы можете видеть, что я добавил новое сообщение «Test» в верхней части метода (вне цикла), если вы видите дубликат " Test "при использовании кода, это означает, что BeforeSave
работает дважды.
В этом случае вам нужно посмотреть, почему он работает дважды, а затем исправить это. Если это не поправимо, то может быть какой-то решение ... синхронизация, такие как:
private int canSave;
public void BeforeSave(BCE.AutoCount.Invoicing.Sales.SalesOrder.SalesOrderBeforeSaveEventArgs e)
{
if (Interlocked.CompareExchange(ref canSave, 0, 1) != 1)
{
// Any cancelation logic that's appropiate here
return;
}
for (int i = 0; i < e.MasterRecord.DetailCount; i++)
{
if (String.IsNullOrEmpty(e.MasterRecord.GetDetailRecord(i).YourPONo.ToString()))
{
MessageBox.Show("You left Your PO No empty. Please check it carefully.");
break; // <--
}
}
}
Затем вы видите canSave
1, чтобы позволить запускать код 0, чтобы запретить его. Операция Interlocked
гарантирует, что код в BeforeSave
не будет запущен до тех пор, пока вы не установите canSave
в 1 где-то в коде (он автоматически устанавливает его в 0 при его выполнении - нет возможности для нескольких потоков испортить его).
Хотя я даю вам решение управлять двойным выполнением BeforeSave
, если он работает в два раза, чем ожидалось, показывает, что есть какая-то проблема в другом месте, и вы должны исправить это (если это не сторонний код).
После наблюдения других ответов, я думаю, что ваш метод BeforeSave вызывается как минимум два раза. В этом случае для отображения окна сообщения только один раз потребуется флаг, который находится вне метода BeforeSave.Таким образом, вы должны либо отправить код, из которого вызывается этот метод, либо убедиться в этом, - вы хотите вызывать BeforeSave несколько раз. –
@ krw12572 Я попытался добавить флаг, как ниже, тот ответ, который они дают, но результат все тот же. – ChengWan
Я добавил еще один ответ, посмотрим, работает ли он сейчас. –