在for循环中仅显示一次对话框 - 已关闭

时间:2016-09-26 03:43:39

标签: c# for-loop

当有多个空文本框时,除了多个对话框提示外,此代码工作正常,但我只希望它提示一次。

例如,如果我输入1,1,(null),(null),d,g,对话框会提示两次,因为有两个空文本框,但我只需要它提示一次。

我该如何解决这个问题?

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

5 个答案:

答案 0 :(得分:2)

你可以简单地引入一个标志:

scala> :javap M -s
Compiled from "<console>"
public class M$ {
  public static final M$ MODULE$;
    Signature: LM$;
  public static {};
    Signature: ()V

  public void m(scala.collection.Seq<java.lang.Object>, M$AMarker$);
    Signature: (Lscala/collection/Seq;LM$AMarker$;)V

  public void m(scala.collection.Seq<java.lang.String>, M$BMarker$);
    Signature: (Lscala/collection/Seq;LM$BMarker$;)V

  public M$();
    Signature: ()V
}

答案 1 :(得分: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; // <--
        }
    }
}

你可以看到我添加了一个新的&#34;测试&#34;方法顶部的消息(循环外),如果你看到重复&#34;测试&#34;使用代码时的消息,表示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双重执行的解决方案,但如果它运行两次超出预期,则显示其他地方存在问题,您应该尝试解决此问题(除非这是第三方代码。)

答案 2 :(得分: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.");
}

我不太了解使用的对象提供linq解决方案

答案 3 :(得分:1)

即使您的BeforeSave方法被多次调用,以下方式也适合您。

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;

答案 4 :(得分: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;
                }
            }
        }
    }