首页 > 解决方案 > 如何计算 Datagridview 上选定行中的金额 - VB.NET

问题描述

如何计算我的表中选定行的数量

我只想用 Printed = 'Y' 和 Receive = 'N' 的状态计算总金额

https://i.stack.imgur.com/iDqPE.png

这是我的代码,此代码只会计算列金额的总数

Dim rows As Integer = 0
Dim total_amount As Double

Try
    Do Until rows = DataGridView1.RowCount
       Dim AMOUNT = DataGridView1.Rows(rows).Cells(1).Value
       total_amount = total_amount + AMOUNT
       rows = rows + 1
    Loop
Catch ex As Exception
End Try

lblAmount.Text = total_amount
Dim dblValue As Double = total_amount
lblTotalWithheld.Text = (dblValue.ToString("N",CultureInfo.InvariantCulture))

标签: vb.net

解决方案


如果你想为网格中的每一行做一些事情,然后遍历Rows集合,例如

For Each row As DataGridViewRow In DataGridView1.Rows
    'Use row here.
Next

如果你想为每个选定的行做一些事情,然后循环遍历SelectedRows集合,例如

For Each row As DataGridViewRow In DataGridView1.SelectedRows
    'Use row here.
Next

你说:

如何计算我的表中选定行的数量

但尚不清楚您的意思是在 UI 中选择还是在指定列中使用指定值。无论哪种方式,循环内的代码都是相同的:

If CStr(row.Cells(0).Value) = "Y" AndAlso CStr(row.Cells(1).Value) = "N" Then
    Dim amount = CDbl(row.Cells(2).Value)

    'Use amount here.
End If

我在那里使用了任意列索引,因此您应该根据需要更改它们。

编辑:

如果您的实际处理标准涉及数据的状态而不是 UI 的状态,那么您实际上根本不应该使用网格,而应该使用数据源。如果您还没有,您应该首先填充 a DataTable,将其绑定到 aBindingSource然后将其绑定到网格,例如

myDataAdapter.Fill(myDataTable)
myBindingSource.DataSource = myDataTable
myDataGridView.DataSource = myBindingSource

然后,您可以循环BindingSource获取所需的数据,例如

Dim amount As Double = 0

For Each rowView As DataRowView In myBindingSource
    If CStr(rowView("Printed")) = "Y" AndAlso
       CStr(rowView("Receive")) = "N" Then
        amount += CDbl(rowView("Amount"))
    End If
Next

你甚至可以向它扔一些 LINQ:

Dim amount = myBindingSource.Cast(Of DataRowView)().
                             Where(Function(drv) CStr(drv("Printed")) = "Y" AndAlso
                                                 CStr(drv("Receive")) = "N").
                             Sum(Function(drv) CDbl(rowView("Amount")))

或者,在查询语法中:

Dim amount = (From drv As DataRowView In myBindingSource
              Where CStr(drv("Printed")) = "Y" AndAlso
                    CStr(drv("Receive")) = "N")
              Select CDbl(rowView("Amount"))).Sum()

但是,可能最简单的选择是使用 的Compute方法DataTable,例如

Dim amount = CDbl(myDataTable.Compute("SUM(Amount)",
                                      "Printed = 'Y' AND Receive = 'N'")

推荐阅读