1

ユーザーがアイテムコードを入力できるように、フォームにテキストボックスがあります。テキストボックスのフォーカスが失われると、データベースを調べて項目コードが存在するかどうかを確認します。ただし、他のテキストボックスをクリックしてフォーカスを失わせようとすると、無限ループが発生します。

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

メソッドのtxtICode.IsFocused終了後は毎回 true に設定され、ループは永遠に続きます。削除してみtxtICode.Focus();ましたが変わりません。私のコードに何か問題がありますか?

フォームに .Net 3.5 と WPF を使用しています。

4

3 に答える 3

1

TextBoxLostFocus イベントでフォーカスを復元する必要はありません。

次の 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");
    }
 }
于 2013-04-10T04:21:25.387 に答える
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;
                }
            }
于 2013-04-10T04:25:34.233 に答える
0

BeginInvoke メソッドを使用して非同期に実行できます。

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;
                    }
                }
            }
        }
    });
}
于 2013-04-10T04:22:22.010 に答える