当有多个空文本框时,除了多个对话框提示外,此代码工作正常,但我只希望它提示一次。
例如,如果我输入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.");
}
}
}
答案 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;
}
}
}
}