你的第一個問題是,你正試圖添加蘋果和橘子一起。
在行:
totalSum += dataGridView1.Rows(i).Cells(5).Value
totalSum是一個整數,而一個DataGridView細胞的Value屬性是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,而不是一個。這兩個表現基本相同,但我發現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#開發,使可能是我錯過了一些東西)。
相反,你想:
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
+1我認爲你釘了它。 – ChrisBD
嗯,我把這個代碼在按鈕單擊事件..我也第一次嘗試vb.net,所以謝謝你的所有解釋..它有助於更新自我..我vl試試這個,很快恢復..再次Thanx ! :) – Ruchi22
嘿..這似乎並沒有爲我工作..我使用此代碼,並嘗試了一些修改將它放在按鈕單擊事件!你能幫我修改我的代碼嗎?我發佈的代碼的第二部分是我正在使用的!謝謝你:) :) – Ruchi22