2016-09-26 11 views
0

このコードは、空のテキストボックスが複数ある場合に複数のダイアログボックスのプロンプトを除いて正常に動作しますが、一度のみプロンプトを表示します。例えば、1,1、(null)、(null)、d、gを入力すると、空のテキストボックスが2つあるのでダイアログボックスは2回表示されますが、一度のみプロンプトを表示する必要があります。forループで1回だけダイアログボックスを表示 - 終了

どうすればこの問題を解決できますか?

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."); 
      } 
     } 
    } 
+0

他の回答を確認した後、あなたのBeforeSaveメソッドが少なくとも2回呼び出されていると思います。この場合、メッセージボックスを1回だけ表示するには、BeforeSaveメソッドの外にあるフラグが必要です。したがって、このメソッドが呼び出されている場所からコードを投稿するか、BeforeSaveを複数回呼び出すことを自分自身で確認する必要があります。 –

+0

@ krw12572私はフラグを追加してみました。 – ChengWan

+0

私は別の答えを追加しました。 –

答えて

0

私はそれを解決する別の方法を見つけました。

public void BeforeSave(BCE.AutoCount.Invoicing.Sales.SalesOrder.SalesOrderBeforeSaveEventArgs e) 
    { 
     int tt = 0; 
     for (int i = 0; i < e.MasterRecord.DetailCount; i++) 
     { 
      if (tt == 0) 
      { 
       if (String.IsNullOrEmpty(e.MasterRecord.GetDetailRecord(i).YourPONo.ToString())) 
       { 
        MessageBox.Show("You left Your PO No empty. Please check it carefully."); 
        tt = 1; 
       } 
      } 
     } 
    } 
2

あなたは、単にフラグを導入することができます

public void BeforeSave(BCE.AutoCount.Invoicing.Sales.SalesOrder.SalesOrderBeforeSaveEventArgs e) 
{ 
    bool hasEmpty = false; 

    for (int i = 0; i < e.MasterRecord.DetailCount; i++) 
    { 
     if (String.IsNullOrEmpty(e.MasterRecord.GetDetailRecord(i).YourPONo.ToString())) 
     { 
      hasEmpty = true; 
     } 
    } 

    if (hasEmpty) { 
     MessageBox.Show("You left Your PO No empty. Please check it carefully."); 
    } 
} 
+0

まだ2のダイアログボックスが表示されています。 – ChengWan

+0

2回表示されている場合は、BeforeSaveが2回呼び出されている可能性がありますか? –

+0

@LeonBambrick 3のユーザーキーが空の場合 "po no"と表示されます。3つの時間が表示されます。空の "PO No" – ChengWan

2

それはチェックを停止するようにループから抜け出すないのはなぜ?

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倍速で実行されている場合は、別の問題があることを示しています。 )。

+0

私はそれを試みたが、うまくいかなかった。 – ChengWan

+0

@ChengWanまあ、それは奇妙です。ブレークを使用した後にループ内でコードが継続する理由はわかりません。私はメッセージを表示するいくつかの他のコードがあると思います。おそらく、この "BeforeSave"メソッドが2回実行されています。 – Theraot

+0

@Theroat私はあなたが私に説明するものを最初に私は感謝しています。私はMessageBox.Show( "Test")を試みました。 // < - しかし、表示されませんでした。 – ChengWan

1

フラグを使用するか、Linqを使用してください。

public void BeforeSave(BCE.AutoCount.Invoicing.Sales.SalesOrder.SalesOrderBeforeSaveEventArgs e) { 
    bool flag = false; 
    for (int i = 0; i < e.MasterRecord.DetailCount; i++) 
    { 
     if (String.IsNullOrEmpty(e.MasterRecord.GetDetailRecord(i).YourPONo.ToString())) 
     { 
      flag = true; 
      break; 
     } 
    } 
    if (flag) 
     MessageBox.Show("You left Your PO No empty. Please check it carefully."); 
} 

あなたのBeforeSaveメソッドが複数回呼び出さ取得されている場合でも、あなたのために働く必要があります私は道に続いて、LINQソリューション

+0

Broはあなたの努力に感謝しています..私はあなたのコードをうまく実行しようとしましたが、結果は同じダイアログボックス2のダイアログボックスから出力されました..他のソリューション? – ChengWan

1

を提供するために使用されるオブジェクトを十分に知りません。

private bool _isMessageBoxShown; 
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())) 
    { 
     if(!_isMessageBoxShown) 
     { 
      _isMessageBoxShown = true; 
      MessageBox.Show("You left Your PO No empty. Please check it carefully."); 
      break; 
     } 
    } 
    }    
} 

ちょうどあなたがあなたのメッセージボックスは、次の時間を示すことにしたいとき、あなたは_isMessageBoxShown = false;を設定する必要があることを確認してください。

+0

broすでに試しました。ダイアログが表示され、私がそれを閉じるならば、それは可能である、それは "はい/いいえ"ダイアログです。それはそれを繰り返し呼び出すことになるでしょうか? – ChengWan

関連する問題