将代码放入文本框事件的最佳位置

时间:2014-05-24 08:02:50

标签: vb.net

我有一个代码放在一个文本框中得到焦点事件。它做的是当它获得一个焦点时它从一个表中找到一个值并将其分配给文本框。但如果它没有值它告诉用户定义它并将焦点放在另一个控件上,如果响应为是,否则告诉用户它不能继续。

我得到的是,如果没有价值并且回答是肯定的,它就无法将焦点放在该控件上并且只是循环消息。任何打破循环的想法如果答案是肯定的。

    qry = "SELECT * FROM [fuel_allowance] WHERE [project number]='" & projcode & "' AND [employee number]='" & empcode & "'" & _
            "AND [current month]=(SELECT [current month] FROM [fuel_allowance] WHERE [project number]='" & projcode & "' AND" & _
            "[employee number]='" & empcode & "' AND MONTH([current month])=" & currentdate.Month & " AND YEAR([current month])=" & _
            "" & currentdate.Year & ")"
    If Button5.Tag = "New" Then
        Dim dr As OleDb.OleDbDataReader = GetData(qry)
        If dr.HasRows = True Then
            Do While dr.Read
                TextBox32.Text = dr.Item("total")
                If Val(TextBox32.Text) > 800 Then
                    TextBox37.Text = Val(TextBox32.Text) - 800
                Else
                    TextBox37.Text = 0
                End If
                TextBox38.Text = Val(TextBox36.Text) + Val(TextBox37.Text)
                TextBox31.Text = (Val(TextBox33.Text) + Val(TextBox32.Text)) * Val(TextBox34.Text)
            Loop

        Else
            If MsgBox("Fuel allowance not defined for the current month of " & MonthName(currentdate.Month, False) & vbCrLf & _
                    "Do you want to define it?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Project Payroll") = MsgBoxResult.Yes Then
                If TextBox32.Focused = True Then
                    TextBox27.Focus()
                End If
            Else
                MsgBox("Cannot define allowance without defining fuel allowance", MsgBoxStyle.Critical, "Project Payroll")
                Exit Sub
            End If
        End If
    End If

1 个答案:

答案 0 :(得分:0)

这似乎是GotFocus事件的一个相当常见的问题。你在这里错过的,与其他所有犯这个错误的人一起,就是MessageBox1在MessageBox关闭后再次触发GotFocus事件。

在此行之后您永远不会执行任何代码:

If MsgBox("Fuel allowance ...") = MsgBoxResult.Yes

您的代码执行是这样的:

  1. 输入文本框
  2. 触发了GotFocus事件
  3. 显示MessageBox并触发TextBox1.LostFocus。
  4. 关闭MessageBox并触发TextBox1.GotFocus。
  5. 显示MessageBox并触发TextBox1.LostFocus。
  6. 我想你明白了。
  7. 我建议您使用TextBox.Enter事件。它仅被触发一次,并且在关闭Messagebox时不会再次调用它。