それはチェックを停止するようにループから抜け出すないのはなぜ?
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
もこの状況で動作します。
テスト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; // <--
}
}
}
は私が(ループ外)メソッドの上部に新しい「テスト」のメッセージを追加し、あなたが重複表示される場合」コードを使用しているときは、BeforeSave
が2回実行されていることを意味します。
その場合、なぜそれが2回実行されているかを確認し、それを修正する必要があります。それが修正可能でない場合は、いくつかのsyncronizationソリューションがあるかもしれない...など:
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; // <--
}
}
}
次に、あなたのコードがそれを許可しないように0を実行できるようにcanSave
1を参照してください。 Interlocked
オペレーションでは、BeforeSave
のコードは、canSave
をコードのどこか1に設定するまで再実行されません(実行時に自動的に0に設定されるため、複数のスレッドが混乱する可能性はありません)。
私はBeforeSave
の二重実行を制御するソリューションを提供していますが、予想よりも2倍速で実行されている場合は、別の問題があることを示しています。 )。
他の回答を確認した後、あなたのBeforeSaveメソッドが少なくとも2回呼び出されていると思います。この場合、メッセージボックスを1回だけ表示するには、BeforeSaveメソッドの外にあるフラグが必要です。したがって、このメソッドが呼び出されている場所からコードを投稿するか、BeforeSaveを複数回呼び出すことを自分自身で確認する必要があります。 –
@ krw12572私はフラグを追加してみました。 – ChengWan
私は別の答えを追加しました。 –