2013-04-10 6 views
1

У меня есть текстовое поле в моей форме для ввода ключа в код элемента. Когда фокус текстового поля потерян, он будет искать в базе данных, чтобы проверить, существует ли код элемента или нет. Тем не менее, я получаю бесконечный цикл, когда пытаюсь потерять фокус, нажимая на другие текстовые поля.TextBox LostFocus бесконечный цикл

private void txtICode_LostFocus(object sender, RoutedEventArgs e) 
    { 
     if (txtICode.IsFocused != true) 
     { 
      if (NewData) 
      { 
       if (txtICode.Text != null) 
       { 
        if (txtICode.Text != "") 
        { 
         Item temp = new Item(); 
         Item[] list = temp.Query(new object[] { Item.DataEnum.Item_Code }, new string[] { txtICode.Text }); 
         if (list.Length > 0) 
         { 
          System.Windows.Forms.MessageBox.Show("This item code is already being used.", "Invalid information"); 
          txtICode.Focus(); 
          return; 
         } 
        } 
       } 
      } 
     } 
    } 

The txtICode.IsFocused устанавливается истина каждый раз после того, как в конце метода и цикл просто продолжается вечно. Я попытался удалить txtICode.Focus();, но это не имеет значения. Что-то не так с моим кодом?

Я использую .Net 3.5 и WPF для моей формы.

+0

Почему восстановление фокуса на событие 'LostFocus'? –

+0

Удалить сообщение и проверить! –

+0

Даже после того, как я прокомментирую сообщение, я все равно получаю бесконечный цикл. Я даже комментирую часть 'txtICode.Focus()'. – Digital

ответ

1

Вам не нужно восстанавливать фокус до TextBox в событии LostFocus.

удалить эти 2 строки:

txtICode.Focus(); 
return; 

Вы могли бы реализовать код более чистый & читаемый путь:

private void txtICode_LostFocus(object sender, RoutedEventArgs e) 
{   
    if (!NewData) 
     return; 

    if (String.IsNullOrEmpty(txtICode.Text)) 
     return; 

    Item temp = new Item(); 
    Item[] list = temp.Query(new object[] { Item.DataEnum.Item_Code }, new string[] { txtICode.Text }); 
    if (list.Length > 0) 
    { 
     System.Windows.Forms.MessageBox.Show("This item code is already being used.", "Invalid information"); 
    } 
} 
+0

Это работает хорошо! Спасибо! Коды действительно были написаны кем-то другим, я пытаюсь исправить некоторые ошибки и улучшить коды. Еще раз спасибо! – Digital

0

Вы можете использовать BeginInvoke Method для выполнения асинхронно:

private void txtICode_LostFocus(object sender, RoutedEventArgs e) 
{ 
    txtICode.Dispatcher.BeginInvoke(() => { 
    if (txtICode.IsFocused != true) 
    { 
     if (NewData) 
     { 
      if (txtICode.Text != null) 
      { 
       if (txtICode.Text != "") 
       { 
        Item temp = new Item(); 
        Item[] list = temp.Query(new object[] { Item.DataEnum.Item_Code }, new string[] { txtICode.Text }); 
        if (list.Length > 0) 
        { 
         System.Windows.Forms.MessageBox.Show("This item code is already being used.", "Invalid information"); 
         txtICode.Focus(); 
         return; 
        } 
       } 
      } 
     } 
    }); 
} 
0
  private void txtICode_LostFocus(object sender, RoutedEventArgs e) 
      { 
       string inputText = txtICode.Text; 
       if (string.IsNullOrEmpty(inputText) || !NewData) 
       { 
        return; 
       } 
       Item temp = new Item(); 
       Item[] list = temp.Query(new object[] { Item.DataEnum.Item_Code }, 
                 new string[] { inputText }); 
       if (list != null && list.Length > 0) 
       { 
        MessageBox.Show("This item code is already being used.", "Invalidinformation"); 
        txtICode.Focus(); 
        return; 
       } 
      } 
Смежные вопросы