检查vb.net中的任何一个或两个texbox是否已更改

时间:2017-01-30 09:31:27

标签: vb.net

是否可以检查一个或两个文本框是否更改了它们的值?

我已根据其中一个更新了我的代码,我想我错过了一些东西。如果更改了id和时间,则查询仅在第一次运行时起作用。如果id单独更改或同时更改或仅更改时间,则不会插入。

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    idchanged = True
    flagam = True
    flagpm = True
End Sub

Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
    timechanged = True
    flagam = True
    flagpm = True
End Sub

MAIN

        Select Case True
            Case idchanged And timechanged
                Dim cmd As New MySqlCommand("select count(*) from attendance where date_format(pmin,'%m %d %Y') = date_format(now(),'%m %d %Y') and empid = '" & TextBox1.Text & "';", conn)
                Dim i As Integer = cmd.ExecuteScalar()
                cmd = Nothing
                If i = 0 AndAlso flagam = True AndAlso flagpm = True Then
                    str_insertAttendance = "insert ignore into attendance (empid, d, amin) values (@id, @date, @amIn)"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@date", time)
                    sqlCommand.Parameters.AddWithValue("@amIn", time)
                    sqlCommand.ExecuteNonQuery()
                    flagam = False
                ElseIf i = 0 AndAlso flagam = False AndAlso flagpm = True Then
                    str_insertAttendance = "update attendance set amout=@amout where empid=@id"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@amout", time)
                    sqlCommand.ExecuteNonQuery()
                    flagpm = False
                ElseIf i = 0 AndAlso flagam = False AndAlso flagpm = False Then
                    str_insertAttendance = "update attendance set pmin=@pmin where empid=@id"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@pmin", time)
                    sqlCommand.ExecuteNonQuery()
                ElseIf i = 1 AndAlso flagam = False AndAlso flagpm = False Then
                    str_insertAttendance = "update attendance set pmout=@pmout where empid=@id"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@pmout", time)
                    sqlCommand.ExecuteNonQuery()
                End If
                idchanged = False
                timechanged = False
            Case Not timechanged And idchanged
                Dim cmd As New MySqlCommand("select count(*) from attendance where date_format(pmin,'%m %d %Y') = date_format(now(),'%m %d %Y') and empid = '" & TextBox1.Text & "';", conn)
                Dim i As Integer = cmd.ExecuteScalar()
                cmd = Nothing
                If i = 0 AndAlso flagam = True AndAlso flagpm = True Then
                    str_insertAttendance = "insert ignore into attendance (empid, d, amin) values (@id, @date, @amIn)"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@date", time)
                    sqlCommand.Parameters.AddWithValue("@amIn", time)
                    sqlCommand.ExecuteNonQuery()
                    flagam = False
                ElseIf i = 0 AndAlso flagam = False AndAlso flagpm = True Then
                    str_insertAttendance = "update attendance set amout=@amout where empid=@id"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@amout", time)
                    sqlCommand.ExecuteNonQuery()
                    flagpm = False
                ElseIf i = 0 AndAlso flagam = False AndAlso flagpm = False Then
                    str_insertAttendance = "update attendance set pmin=@pmin where empid=@id"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@pmin", time)
                    sqlCommand.ExecuteNonQuery()
                ElseIf i = 1 AndAlso flagam = False AndAlso flagpm = False Then
                    str_insertAttendance = "update attendance set pmout=@pmout where empid=@id"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@pmout", time)
                    sqlCommand.ExecuteNonQuery()
                End If
                idchanged = False
            Case Not idchanged And timechanged
                Dim cmd As New MySqlCommand("select count(*) from attendance where date_format(pmin,'%m %d %Y') = date_format(now(),'%m %d %Y') and empid = '" & TextBox1.Text & "';", conn)
                Dim i As Integer = cmd.ExecuteScalar()
                cmd = Nothing
                If i = 0 AndAlso flagam = True AndAlso flagpm = True Then
                    str_insertAttendance = "insert ignore into attendance (empid, d, amin) values (@id, @date, @amIn)"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@date", time)
                    sqlCommand.Parameters.AddWithValue("@amIn", time)
                    sqlCommand.ExecuteNonQuery()
                    flagam = False
                ElseIf i = 0 AndAlso flagam = False AndAlso flagpm = True Then
                    str_insertAttendance = "update attendance set amout=@amout where empid=@id"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@amout", time)
                    sqlCommand.ExecuteNonQuery()
                    flagpm = False
                ElseIf i = 0 AndAlso flagam = False AndAlso flagpm = False Then
                    str_insertAttendance = "update attendance set pmin=@pmin where empid=@id"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@pmin", time)
                    sqlCommand.ExecuteNonQuery()
                ElseIf i = 1 AndAlso flagam = False AndAlso flagpm = False Then
                    str_insertAttendance = "update attendance set pmout=@pmout where empid=@id"
                    sqlCommand.CommandText = str_insertAttendance
                    sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
                    sqlCommand.Parameters.AddWithValue("@pmout", time)
                    sqlCommand.ExecuteNonQuery()
                End If
                timechanged = False
        End Select

2 个答案:

答案 0 :(得分:2)

您可以让两个文本框订阅同一个事件,如下所示:

Private Sub TextBoxAOrB_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles textboxa.TextChanged, textboxb.TextChanged
    Dim txtBoxSender As TextBox = sender

    If txtBoxSender.Equals(textboxa) Then
        'DO STUFF
    ElseIf txtBoxSender.Equals(textboxb) Then
        If textboxa.Text <> id Then
            'TEXTBOX A also changed
            ' DO STUFF
        End If
    Else
        'SOMETHING WRONG
    End If
End Sub

由于您一次只能检查一个值,这将在textboxa更改时运行,如果textboxb在此之后发生更改则会再次运行,但如果textboxb自行更改则不会运行(这似乎就是您在问题中所说的内容)

答案 1 :(得分:1)

如果您依赖事件,您可能会遇到运行哪个评估代码的问题。

只要用户更改了任何内容TextBox1,即使按下了一个键,TextBox1.Changed事件也会触发。没有办法判断用户是否要更改TextBox2并让代码等到所有更改都在评估开始之前完成。

但是,如果您要等到用户完成对TextBoxes之一或两者的更改,然后让他们点击按钮(让我们称之为btnEvaluate),您可以使用相应的每个文本框的.Changed事件将布尔标志更改为true,然后在btnEvaluate单击事件中,您可以运行适合哪些标志为真的代码。

像这样 - 我想...

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    tb1Changed = True
End Sub

Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
    tb2Changed = True
End Sub

Private Sub btnEvaluate_Click(sender As Object, e As EventArgs) Handles btnEvaluate.Click
    Select Case True
        Case tb1Changed And tb2Changed
            'do stuff 1st block of code
            tb1Changed = False
            tb2Changed = False
        Case not tb1Changed And tb2Changed
            'dostuff 2nd block of code
            tb2Changed = False
    End Select
End Sub

如果您需要将标记设置为False并将其放在其他地方

,您当然可以删除代码以将标记设置为True