For Next循环中的if else语句出现问题

时间:2020-03-06 01:30:36

标签: vb.net

在数据库中插入数据时,我试图进行验证。我的datagridview = dgvAddMRR上有一个combobox = cbox_status,一个qtyorder列和qtyreceived列。我正在尝试做的是,当cbox_status =接收到-缺少并且qtyorder列上的所有行= qtyreceived列上的所有行时,它应该通知将cbox_status更改为Received-Complete。但是,当cbox_status =已接收-已完成且qtyorder列上的某行= qtyreceived列上的某行而qtyorder列上的某行!=已接收qty列上的某行时,它应通知我将cbox_status更改为Received-Lacking。我在我的代码上的问题是,即使cbox_status = Received-完成,某些行qtyorder = qtyreceived和某些行qtyorder!= qtyreceived,它也会继续在数据库中插入数据,这是错误的,因为它应该通知我将cbox_status更改为Received - 不足。希望你能理解我的问题。请帮助我。

这是我的代码。 。

Private Sub btn_done_Click(sender As Object, e As EventArgs) Handles btn_done.Click
    If tb_mrrno.Text = "" Or tb_pono.Text = "" Or tb_requestedby.Text = "" Or tb_intendedfor.Text = "" Or tb_purpose.Text = "" Or tb_suppliers.Text = "" Or tb_supplierdrno.Text = "" Or cbox_status.Text = "" Or dgvAddMRR.RowCount = 0 Then
        MsgBox("Please fill all necessary fields including selecting an Item.", MessageBoxIcon.Exclamation)
    Else
        For Each row As DataGridViewRow In dgvAddMRR.Rows
            Dim qtyorder As Double = row.Cells("qtyorder").Value.ToString
            Dim qtyreceived As Double = row.Cells("qtyreceived").Value.ToString
            Dim balance As Double = row.Cells("balance").Value.ToString


            If qtyorder.ToString > qtyreceived.ToString And cbox_status.Text = "Received - Complete" Then
                MsgBox("On Status, please select Received - Lacking to proceed.", MessageBoxIcon.Exclamation)
            ElseIf (cbox_status.Text = "Received - Lacking") And (qtyorder.ToString = qtyreceived.ToString) Then
                MsgBox("On Status, please select Received - Complete to proceed.", MessageBoxIcon.Exclamation)
            End If

            If qtyorder.ToString > qtyreceived.ToString And cbox_status.Text = "Received - Lacking" Then
                InsertMRR_newave()
            End If
            If (cbox_status.Text = "Received - Complete") And (qtyorder.ToString = qtyreceived.ToString) Then
                InsertMRR_newave()
            End If
        Next
    End If
End Sub

2 个答案:

答案 0 :(得分:0)

我认为问题可能在于使用>比较字符串。尝试另一种选择,也许是研究StrComp(https://www.educba.com/vba-string-comparison/)或InStr。

下面的链接是Microsoft对字符串如何与=,>,<运算符进行比较的说明。 https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/operators-and-expressions/comparison-operators

与>一起使用时,使用>可获得有趣的结果。 假设这些值已声明或转换为字符串...

“ 73” <“ 9”

'先前比较的结​​果为True。

希望这可以将您指向正确的位置。

答案 1 :(得分:0)

将第一个If语句中的每个Or更改为OrElse,因为它会在遇到True条件时立即短路该行,而不是评估每个条件。

您正在混合MessageBox和MsgBox。我将其更改为更具便携性的MessageBox。

您需要退出Sub,以便您的代码在MessageBox之后不会继续。继续执行代码将最终插入数据。

由于Option Strict会告诉您摆脱.ToString。您似乎没有使用余额。

为什么不只是在代码中重置组合框而不是让用户这样做。否则,您将需要更多的退出订阅。

我向InsertMRR_newave(row)添加了一个参数。如果您使用此方法逐行更新数据库,则将是必需的。

如果InsertMRR_newave通过.Update方法使用数据适配器,则在for循环之后才应调用它。

Private Sub btn_done_Click(sender As Object, e As EventArgs) Handles btn_done.Click
    If tb_mrrno.Text = "" OrElse tb_pono.Text = "" OrElse tb_requestedby.Text = "" OrElse tb_intendedfor.Text = "" OrElse tb_purpose.Text = "" OrElse tb_suppliers.Text = "" OrElse tb_supplierdrno.Text = "" OrElse cbox_status.Text = "" OrElse dgvAddMRR.RowCount = 0 Then
        MessageBox.Show("Please fill all necessary fields including selecting an Item.", "Missing Data", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        Exit Sub
    End If
    For Each row As DataGridViewRow In dgvAddMRR.Rows
        Dim qtyorder As Double = CDbl(row.Cells("qtyorder").Value)
        Dim qtyreceived As Double = CDbl(row.Cells("qtyreceived").Value)
        'Dim balance As Double = CDbl(row.Cells("balance").Value)
        If qtyorder > qtyrecieved Then
            row.Cells(ComboBoxColumnName.Index).Value = "Received - Lacking"
        Else
            row.Cells(ComboBoxColumnName.Index).Value = "Received - Complete"
        End If
        InsertMRR_newave(row)
    Next
End Sub