For Each row As DataGridViewRow In DataGridView1.Rows
If row.Cells(0).Value = "Hawaiian" Then
row.Cells(1).Value = Double.Parse(NumericUpDown1.Value)
row.Cells(2).Value = Double.Parse(row.Cells(1).Value) * price
Exit Sub
End If
Next
DataGridView1.Rows.Add("Hawaiian", 1, price)
我在 NumericUpDown 中放入以将项目添加到 DataGridView1 的代码在上面
我希望在数量或金额等于零时删除该行,在这种情况下,是夏威夷语要删除的行
If NumericUpDown1.Value = 0 Then
DataGridView1.Rows.RemoveAt(DataGridView1.CurrentRow.Index)
End If
我试过这个,但它只删除了 DataGridView1 中的第一行。如果您知道答案,请帮助我,我真的很感激。我已经尝试解决这个问题一个星期了,在网上用了这么多方法都不起作用,我仍然毫无头绪。
展开:我从注释中添加的代码,它没有删除
代码
你正在使这比它必须的复杂得多。为了简化事情,我建议您创建一个采用三 (3) 个参数的方法;string
比萨饼名称,decimal
数量和decimal
价格。
在此方法中,第一步是检查数量是否为零。如果为零,则遍历网格中的所有行,直到找到披萨名称。如果未找到披萨名称,那么我们可以返回,因为该行一开始就不存在。如果找到该行,那么我们将删除该行。
如果数量不为零,那么我们将遍历网格中的所有行,直到找到披萨名称。如果未找到披萨名称,则我们知道我们要将该行"添加"到网格中。如果找到披萨名称,则更新数量和数量单元格。
此方法可能看起来像...
Private Sub AddOrRemovePizzaInGrid(targetPizza As String, quantity As Decimal, price As Decimal)
If quantity = 0 Then
For Each row As DataGridViewRow In DataGridView1.Rows
If row.Cells("Item").Value IsNot Nothing Then
If row.Cells("Item").Value.ToString().Equals(targetPizza) Then
DataGridView1.Rows.Remove(row)
Return
End If
End If
Next
Return
End If
' quantity is not zero
For Each row As DataGridViewRow In DataGridView1.Rows
If Not row.IsNewRow Then
If row.Cells("Item").Value IsNot Nothing Then
If row.Cells("Item").Value.ToString().Equals(targetPizza) Then
row.Cells("Qty").Value = quantity
row.Cells("Amount").Value = quantity * price
Return
End If
End If
End If
Next
' if we get here - the target pizza was not found so add as new row
DataGridView1.Rows.Add(targetPizza, quantity, quantity * price)
End Sub
此外,由于表单上有许多 NUD (NumericUpDown
) 控件,并且每个 NUD 都绑定到特定的比萨饼,因此我建议您创建一 (1) 个ValueChanged
事件并让"每个"NUD 订阅同一事件,而不是为"每个"NUD 设置ValueChanged
事件。当事件触发时,我们将检查"哪个"NUD 正在更改其值,然后只需使用正确的信息调用上述方法。这应该会将您必须管理的事件数减少到所有 NUD 的一个ValueChanged
事件。
为了使代码更具可读性,我建议您为每个NUD指定一个更合乎逻辑的名称,例如NUD_Pepperoni
,NUD_Hawaiian
等...因为我们将使用 NUDName
属性来标识"哪个"NUD 值已更改。使用上述方法的此事件可能类似于...
Private Sub NUD_ValueChanged(sender As Object, e As EventArgs) Handles NUD_Pepperoni.ValueChanged, NUD_Hawaiian.ValueChanged, NUD_Americano.ValueChanged
Dim target_NUD As NumericUpDown = CType(sender, NumericUpDown)
Select Case target_NUD.Name
Case "NUD_Pepperoni"
AddOrRemovePizzaInGrid("Pepperoni", target_NUD.Value, 8.5D)
Case "NUD_Hawaiian"
AddOrRemovePizzaInGrid("Hawaiian", target_NUD.Value, 8.5D)
Case "NUD_Americano"
AddOrRemovePizzaInGrid("Americano", target_NUD.Value, 8.5D)
' add more pizza types here
End Select
End Sub
根据屏幕截图,我认为您希望在数量设置为零时从 DataGridView 中删除项目行,如果是这样:
您必须先查看 DGV 中的行索引,然后通过执行以下操作将其删除:
制作一个子以查找相关行并将其删除 从 Numeric 对象的 ValueChanged 事件调用此 sub,如下所示:
Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
If NumericUpDown1.Value = 0 Then
DeleteRowFromDGV("Hawaiian")
End If
End Sub
Private Sub DeleteRowFromDGV(itemName As String)
With DataGridView1
Dim rowToDelete As Short
For i As Short = 0 To .RowCount - 1
If .Item(0, i).Value = itemName Then 'suppose that the column index of item name is 0
rowToDelete = i
Exit For
End If
Next
.Rows.RemoveAt(rowToDelete)
End With
End Sub