This may not be the best method, but it works.
Public Class Form1
Private dt As New DataTable()
Private dv As DataView
Private indexRT As Int32
Private indexColumnToRT As Int32
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With dt
' make some data
.Columns.Add("SomethingToTotal", GetType(Double))
.Columns.Add("SomethingElse", GetType(String))
.Rows.Add(New Object() {1.0#, "fred"})
.Rows.Add(New Object() {12.0#, "barney"})
.Rows.Add(New Object() {1.0#, "wilma"})
.Rows.Add(New Object() {50.0#, "betty"})
.Rows.Add(New Object() {33.0#, "pebbles"})
.Columns.Add("RunningTotal", GetType(Double)) ' If your datatable is filled from a DB
' then add this column after filling it
indexRT = .Columns("RunningTotal").Ordinal
indexColumnToRT = .Columns("SomethingToTotal").Ordinal
End With
dv = dt.DefaultView 'set the dataview used
' force the 1st computaion of the running total
dv_ListChanged(Nothing, New System.ComponentModel.ListChangedEventArgs(System.ComponentModel.ListChangedType.Reset, 0))
DataGridView1.DataSource = dv
DataGridView1.Columns("RunningTotal").DisplayIndex = 1
End Sub
Private Sub dv_ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs)
If e.ListChangedType = System.ComponentModel.ListChangedType.ItemChanged AndAlso _
e.PropertyDescriptor IsNot Nothing AndAlso _
e.PropertyDescriptor.Name <> "SomethingToTotal" Then 'don't process
Exit Sub
End If
' since we will be changing a item in the list, decouple event
RemoveHandler dt.DefaultView.ListChanged, AddressOf dv_ListChanged
Dim rt As Double = 0 ' initialize running total
For Each drv As DataRowView In dv
If drv(indexColumnToRT) IsNot DBNull.Value Then ' make sure it is not DbNull
rt += CDbl(drv(indexColumnToRT))
End If
drv(indexRT) = rt
Next
AddHandler dt.DefaultView.ListChanged, AddressOf dv_ListChanged ' rewire the event
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
dv.RowFilter = "[SomethingElse]<='e'" 'set some filter to show that that will work as well
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
dv.Sort = "[SomethingElse] Asc"
End Sub
End Class