投稿者 るきお  (社会人) 投稿日時 2019/12/8 21:58:43
どのようなプログラムの作りになっているかや具体的にわからないポイントがわからなかったので、VB2019でサンプルを作ってみました。

>一旦グリッドに表示されたデータを絞り込みし、
>絞り込まれた後のデータの変化を最初に加算して表示した値に反映(加算,減算)する方法
絞り込んだ結果は普通に作るとDataViewになるのに対し、
データ本体はDataTableなので常に本体のDataTableの方を集計していれば表示とは関係なく合計を計算できます。

Option Strict On

Public Class Form1

    ''' <summary> 
    ''' フォーム表示時の初期処理 
    ''' </summary> 
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown

        'データ取得 
        Dim table As DataTable = LoadData()

        '初期表示。あとでフィルターをかける予定なのではじめからDataViewを設定しておく。 
        DataGridView1.DataSource = table.DefaultView

        '初期状態の合計値 
        RefreshAmount()

    End Sub

    ''' <summary> 
    ''' 初期データをロードします。 
    ''' 本来はデータベースから読み込む処理が記述されるはずですが、 
    ''' このサンプルでは固定のデータを返します。 
    ''' </summary> 
    ''' <returns></returns> 
    Private Function LoadData() As DataTable

        Dim table As New DataTable
        table.Columns.Add("商品CD"GetType(String))
        table.Columns.Add("金額"GetType(Integer))
        table.Columns.Add("消費税額"GetType(Integer))

        table.Rows.Add("001", 300, 30)
        table.Rows.Add("002", 400, 40)
        table.Rows.Add("003", 500, 50)
        table.Rows.Add("003", 600, 60)

        Return table

    End Function


    ''' <summary> 
    ''' 合計金額と合計消費税額をLabelに表示します。 
    ''' </summary> 
    Private Sub RefreshAmount()

        '現在バインドされているもとのDataTableを取得 
        Dim table As DataTable = DirectCast(DataGridView1.DataSource, DataView).Table
        Dim amount = Summary(table)

        Label1.Text = amount.TotalKingaku.ToString
        Label2.Text = amount.TotalZeigaku.ToString

    End Sub

    ''' <summary> 
    ''' 合計金額と合計消費税額を計算します。 
    ''' </summary> 
    ''' <param name="table"></param> 
    ''' <returns></returns> 
    Private Function Summary(table As DataTable) As (TotalKingaku As Integer, TotalZeigaku As Integer)

        Dim totalKingaku As Integer
        Dim totalZeigaku As Integer

        For Each row As DataRow In table.Rows
            totalKingaku += CInt(row.Item(1))
            totalZeigaku += CInt(row.Item(2))
        Next

        Return (totalKingaku, totalZeigaku)

    End Function


    ''' <summary> 
    ''' 検索ボタン 
    ''' </summary> 
    ''' <param name="sender"></param> 
    ''' <param name="e"></param> 
    Private Sub btnFilter_Click(sender As Object, e As EventArgs) Handles btnFilter.Click

        Dim table As DataTable = DirectCast(DataGridView1.DataSource, DataView).Table

        If Len(Trim(txtShohinCd.Text)) = 0 Then
            '何も入力されていない場合フィルターを解除 
            table.DefaultView.RowFilter = ""
        Else
            table.DefaultView.RowFilter = "商品CD = " & txtShohinCd.Text
        End If

        'ビューをDataGridViewにバインドさせる。 
        DataGridView1.DataSource = table.DefaultView

    End Sub

    Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        'DataGridView1のセルが編集された場合合計の表示を更新します。 
        RefreshAmount()
    End Sub


End Class