Warum nicht brechen aus der Schleife, so dass sie die Überprüfung nicht mehr reagiert?
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
wird auch in dieser Situation funktionieren.
Testen Sie, ob BeforeSave
läuft zweimal:
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; // <--
}
}
}
Wie yo sehen kann ich eine neue „Test“ Nachricht an der Spitze des Verfahrens hinzugefügt (außerhalb der Schleife), wenn Sie doppelte siehe " Testen Sie "Nachrichten", wenn Sie den Code verwenden, bedeutet dies, dass BeforeSave
zweimal ausgeführt wird.
In diesem Fall müssen Sie sehen, warum es zweimal ausgeführt wird, und dann das beheben. Wenn das nicht reparierbar ist, dann könnte es einige syncronization Lösung sein ... wie:
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; // <--
}
}
}
Dann sehen Sie canSave
1 den Code zu ermöglichen 0 zu laufen, es zu verbieten. Die Interlocked
Operation wird sicherstellen, dass der Code in BeforeSave
nicht erneut ausgeführt wird, bis Sie canSave
auf 1 irgendwo im Code setzen (es setzt es automatisch auf 0, wenn es ausgeführt wird - keine Chance für mehrere Threads, es zu vermasseln).
Obwohl ich Ihnen eine Lösung zur Kontrolle der doppelten Ausführung von BeforeSave
geben, wenn es zweimal als erwartet ausgeführt wird, zeigt, dass es irgendwo woanders ein Problem gibt, und Sie sollten versuchen, das zu beheben (es sei denn, es ist Code von Drittanbietern)).
Nachdem ich andere Antworten beobachtet habe, denke ich, dass Ihre BeforeSave-Methode mindestens zweimal aufgerufen wird. In diesem Fall erfordert das Anzeigen eines Meldungsfelds nur einmal ein Flag, das außerhalb der BeforeSave-Methode liegt.Sie sollten also entweder den Code, von dem diese Methode aufgerufen wird, posten oder sich selbst verifizieren, dass - Sie BeforeSave mehrmals aufrufen möchten. –
@ krw12572 Ich habe versucht, eine Flagge wie folgt die Antworten hinzufügen sie geben, aber das Ergebnis immer noch gleich. – ChengWan
Ich habe eine andere Antwort hinzugefügt, sehen Sie, ob es jetzt für Sie funktioniert. –