2016-09-26 5 views
0

Dieser Code funktioniert gut, außer mehrere Dialogfeld Eingabeaufforderung, wenn es mehrere leere Textbox, aber ich möchte nur einmal aufgefordert.Show Dialogfeld nur einmal in einer for-Schleife - Closed

Zum Beispiel, wenn ich 1,1 eingeben, (Null), (Null), d, g, Dialogfeld wird zweimal aufgefordert, da gibt es zwei leere Textfelder, aber ich brauche es nur einmal zu bestätigen.

Wie kann ich dieses Problem lösen?

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

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. –

+0

@ krw12572 Ich habe versucht, eine Flagge wie folgt die Antworten hinzufügen sie geben, aber das Ergebnis immer noch gleich. – ChengWan

+0

Ich habe eine andere Antwort hinzugefügt, sehen Sie, ob es jetzt für Sie funktioniert. –

Antwort

0

Ich fand einen anderen Weg, um es zu lösen.

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

Sie einfach eine Fahne vorstellen kann:

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

Es ist noch Show 2 Dialogfeld. – ChengWan

+0

Wenn es zweimal angezeigt wird, wird BeforeSave möglicherweise zweimal aufgerufen? –

+0

@LeonBambrick Wenn der Benutzer in 3 leere "po no" eingeben, wird es 3 Mal aufgefordert.Es wird folgen, wie viele leere "PO Nein" .. irgendeinen Vorschlag? – ChengWan

2

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)).

+0

Ich habe das versucht, aber es hat nicht funktioniert. – ChengWan

+0

@ChengWan gut, das ist seltsam. Ich sehe nicht, warum der Code in der Schleife fortgesetzt wird, nachdem er Pause verwendet hat. Ich würde denken, dass es einen anderen Code gibt, der die Nachricht zeigt, vielleicht wird diese "BeforeSave" -Methode zweimal ausgeführt. – Theraot

+0

@Theroat zuerst werde ich geschätzt, was Sie mir erklären. Ich habe versucht MessageBox.Show ("Test"); // <- aber es ist nicht aufgetaucht. – ChengWan

1

Verwenden Sie entweder eine Flagge oder verwenden Sie 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."); 
} 

Ich weiß nicht genug von den verwendeten Objekten einer Linq-Lösung

+0

Bro danke für deine Mühe .. Ich habe versucht, Ihren Code gut laufen, aber das Ergebnis immer noch gleich prompt aus 2 Dialog .. eine andere Lösung? – ChengWan

1

Nach Art und Weise bieten sollte für Sie arbeiten, auch wenn Ihre Methode Beforemehrmal aufgerufen zu werden.

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; 
     } 
    } 
    }    
} 

So stellen Sie sicher, dass, wenn Sie Ihre messagebox wollen beim nächsten Mal gezeigt werden, Sie _isMessageBoxShown = false; einstellen müssen.

+0

Bro habe ich schon probiert. ist das ein mögliches es ist ein "ja/nein" dialog wenn der dialog angezeigt wird und ich es schließe. also wird es immer wieder rausgerufen? – ChengWan