C# 文本框LostFocus无限循环

C# 文本框LostFocus无限循环,c#,wpf,C#,Wpf,我的表单中有一个文本框,供用户输入项目代码。 当文本框的焦点丢失时,它将查看数据库以检查项目代码是否存在。 然而,当我试图通过点击其他文本框而失去焦点时,我得到了无限循环 private void txtICode_LostFocus(object sender, RoutedEventArgs e) { if (txtICode.IsFocused != true) { if (NewData) {

我的表单中有一个文本框,供用户输入项目代码。 当文本框的焦点丢失时,它将查看数据库以检查项目代码是否存在。 然而,当我试图通过点击其他文本框而失去焦点时,我得到了无限循环

    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。

在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");
    }
 }

在LostFocus事件中,您不必将焦点恢复到
TextBox

删除以下两行:

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");
    }
 }
您可以使用异步执行:

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;
                    }
                }
            }
        }
    });
}
您可以使用异步执行:

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

为什么要恢复对
LostFocus
事件的关注?删除msgbox并检查!即使在我注释掉messagebox之后,我仍然得到无限循环。我甚至注释掉了
txtICode.Focus()
部分。您在哪里注册LostFocus事件,请确保您多次订阅它。为什么要将焦点恢复到
LostFocus
事件上?请删除msgbox并检查!即使在我注释掉messagebox之后,我仍然得到无限循环。我甚至注释掉了
txtICode.Focus()
部分。您在哪里注册LostFocus事件,请确保您多次订阅它。这很好!非常感谢。这些代码实际上是由其他人编写的,我正在尝试修复一些错误并改进代码。再次感谢!这个很好用!非常感谢。这些代码实际上是由其他人编写的,我正在尝试修复一些错误并改进代码。再次感谢!