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

您不必TextBox在 LostFocus 事件中恢复焦点。

删除这两行:

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

您可以使用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 回答
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 回答