Первая проблема заключается в том, что вы пытаетесь добавить яблоки и апельсины вместе.
В строке:
totalSum += dataGridView1.Rows(i).Cells(5).Value
totalSum - целое число, а свойство Value ячейки DataGridView -типа object
.
Эта проблема аналогична той, которую вы видите, пытаясь использовать DataTable, за исключением того, что ваше свойство Item дает вам DBNull, а не объект обратно.
Здесьэто код, который вы хотите (я в основном разработчик C #, поэтому VB.Net может не хватать элегантности, но он работает).
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim sum As Integer
sum = 0
For Each row As DataGridViewRow In DataGridView1.Rows
Dim current As Integer
If Integer.TryParse(row.Cells("OrderQty").Value.ToString, current) Then
sum += current
End If
Next
TextBox1.Text = sum.ToString
End Sub
Некоторые вещи, которые стоит отметить в этом коде:
- Я использую For Each, а не for.Они работают в основном одинаково, но я нахожу foreach более читабельным
- Я использую Integer.TryParse для значения ячейки перед его использованием.Это безопаснее, чем просто приводить значение ячейки напрямую.
- Вместо того, чтобы использовать индексы столбцов, которые немного хрупки, я использую имена столбцов.
С вашей проверкой, установлен ли флажокпроверено, что вы можете сделать что-то похожее:
Boolean.TryParse(row.Cells("IsChecked").Value.ToString, cb)
И последнее замечание: если вы попытаетесь выполнить этот код в методе cellclick объекта DataGridView, у вас возникнут проблемы - состояние флажкане фиксируется до тех пор, пока не будет нажата ячейка, поэтому последняя проверенная ячейка не будет добавлена в ваш счетчик.Вместо этого вы захотите обработать CellDirtyStateChanged и зафиксировать изменения, а затем выполнить суммирование в обработчике CellValueChanged.
Чтобы проиллюстрировать, что попробуйте этот код:
Private Sub dgv_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
Dim sum As Integer
sum = 0
Dim cb As Boolean
cb = False
If DataGridView1.Columns(e.ColumnIndex).Name <> "IsChecked" Then
Return
End If
For Each row As DataGridViewRow In DataGridView1.Rows
If Boolean.TryParse(row.Cells("IsChecked").Value.ToString, cb) Then
If cb Then
Dim current As Integer
If Integer.TryParse(row.Cells("OrderQty").Value.ToString, current) Then
sum += current
End If
End If
End If
Next
TextBox1.Text = sum.ToString
End Sub
Сумма всегда будет отставать на единицущелкните позади (на самом деле в VB.Net он, кажется, просто не работает), но я больше ac # dev, чтобы я мог что-то упустить).
Вместо этого вы хотите:
Sub dataGridView1_CurrentCellDirtyStateChanged( _
ByVal sender As Object, ByVal e As EventArgs) _
Handles DataGridView1.CurrentCellDirtyStateChanged
If DataGridView1.IsCurrentCellDirty Then
DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
' If a check box cell is clicked, this event handler disables
' or enables the button in the same row as the clicked cell.
Public Sub dataGridView1_CellValueChanged(ByVal sender As Object, _
ByVal e As DataGridViewCellEventArgs) _
Handles DataGridView1.CellValueChanged
If DataGridView1.Columns(e.ColumnIndex).Name = "IsChecked" Then
Dim sum As Integer
sum = 0
Dim cb As Boolean
For Each row As DataGridViewRow In DataGridView1.Rows
If Boolean.TryParse(row.Cells("IsChecked").Value.ToString, cb) Then
If cb Then
Dim current As Integer
If Integer.TryParse(row.Cells("OrderQty").Value.ToString, current) Then
sum += current
End If
End If
End If
Next
TextBox1.Text = sum.ToString
End If
End Sub