2016-09-26 3 views
0

Этот код отлично работает, за исключением нескольких приглашений диалогового окна, когда есть несколько пустых текстовых полей, но я хочу, чтобы он сразу запрашивал.Показать диалоговое окно только один раз в цикле for - Закрыто

Например, если я ввещу 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

После наблюдения других ответов, я думаю, что ваш метод BeforeSave вызывается как минимум два раза. В этом случае для отображения окна сообщения только один раз потребуется флаг, который находится вне метода 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

Если он отображается дважды, то BeforeSave может быть вызван дважды? –

+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 также будет работать в этой ситуации.


Test, если 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; // <-- 
     } 
    } 
} 

Как то вы можете видеть, что я добавил новое сообщение «Test» в верхней части метода (вне цикла), если вы видите дубликат " Test "при использовании кода, это означает, что 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, если он работает в два раза, чем ожидалось, показывает, что есть какая-то проблема в другом месте, и вы должны исправить это (если это не сторонний код).

+0

Я пробовал это, но это не сработало. – ChengWan

+0

@ChengWan хорошо, это странно. Я не понимаю, почему код будет продолжаться в цикле после использования break. Я думаю, что есть еще один код, показывающий сообщение, возможно, этот метод «BeforeSave» работает дважды. – Theraot

+0

@Theroat во-первых, я ценю то, что вы мне объясняете. Я попробовал MessageBox.Show («Тест»); // <- но он не появился. – 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."); 
} 

не знаю достаточное количество используемых объектов, чтобы предложить LinQ Раствора

+0

Bro поблагодарить за ваши усилия .. Я действительно пробовал ваш код работать хорошо, но результат все же тот же запрос 2 диалога .. любое другое решение? – ChengWan

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

Просто убедитесь, что, когда вы хотите, чтобы ваш MessageBox будет показан в следующий раз, вам нужно будет установить _isMessageBoxShown = false;.

+0

bro Я уже пробовал. что возможно это диалог «да/нет», если диалог покажет, и я закрою его. так что он будет продолжать повторять его? – ChengWan