トップ ページ > VisualBasic 2010(express) > VisualBasic 小計行の挿入

VisualBasic 小計行の挿入

AAA

今回は、以下のようなデータをソートして、小計行を挿入します。
  1. フォームのコードを書きます
    'ODP.NETの名前空間を追加
    Imports Oracle.DataAccess.Client
    
    Public Class Form1
    
    	'データセットの作成
    	'他からも使用できるようにクラス変数にし、スコープをsharedにしておく
    	Shared ds As DataSet = New DataSet()
    	Shared table As New DataTable()
    	
    	Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    	        ds.Clear()
            	'行の全削除
    	        If Me.DataGridView1.Rows.Count > 0 Then
    	            For i = 0 To Me.DataGridView1.Rows.Count - 1 Step 1
    			Me.DataGridView1.Rows.RemoveAt(0)
    		    Next
    		End If
    
    		'変数宣言
    		Dim subTotal As Integer
    		Dim subTotalName As String : subTotalName = ""
    
    		'TNSNAMES.ORAを使用する場合
    		Dim oradb As String = "Data Source=ORCL.grot3.com;User Id=orcladm;Password=orcladm;"
    		Dim conn As New OracleConnection(oradb)
    		conn.Open()
    
    		'SQL
    		Dim sql As String = "SELECT * FROM TESTTBL01"
    		Dim cmd As New OracleCommand(sql, conn)
    		cmd.CommandType = CommandType.Text
    
    		'アダプタの作成
    		Dim adapter As OracleDataAdapter = New OracleDataAdapter(sql, conn)
    		adapter.Fill(ds, "TABLE1")
    
    		'バインドデータの作成
    		BindingSource1.DataSource = ds.Tables("TABLE1")
    
    		'使ったオブジェクトをクローズする
    		conn.Close()
    
    		'##################################
    		'ここから小計行の動作
    		'##################################
    
    		'集計するキー項目と小計行の指定
    		Dim subTotalKey As String : subTotalKey = "NAME"
    		Dim subTotalColumnName As String : subTotalColumnName = "PRICE"
    		Dim currentColumnName As String : currentColumnName = ""
    
    		'データビューを作成し、ソート後にテーブルへ変換
    		Dim dataview As DataView = New DataView(ds.Tables("TABLE1"))
    		dataview.Sort = subTotalKey
    		table = dataview.ToTable
    
    		'DataGridViewへのヘッダ行の作成
    		DataGridView1.ColumnCount = table.Columns.Count.ToString()
    		For i = 0 To table.Columns.Count - 1
    	            DataGridView1.Columns(i).HeaderText = table.Columns.Item(i).ColumnName
    		Next
    
    		'k=追加した小計行数用変数
    		Dim k As Integer
    		k = 0
    
    		'行の数だけループ(i=行)
    		For i = 0 To table.Rows.Count - 1
    		    '小計値を取得(j=列)
    		    If currentColumnName <> table.Rows(i).Item(subTotalKey).ToString Then
    			'一行目は必ず前行と異なるので、行追加はしない。
    			If i <> 0 Then
    			    DataGridView1.RowTemplate.DefaultCellStyle.BackColor = Color.Gray
    			    Me.DataGridView1.Rows.Add()
    			    DataGridView1.RowTemplate.DefaultCellStyle.BackColor = Nothing
    			    Me.DataGridView1(1, i + k).Value = currentColumnName & "(小計):" & subTotal
    			    k = k + 1
    			End If
    
    			subTotal = table.Rows(i).Item(subTotalColumnName)
    			currentColumnName = table.Rows(i).Item(subTotalKey).ToString
    		    Else
    			subTotal = subTotal + table.Rows(i).Item(subTotalColumnName)
    		    End If
    
    		    'tableをDataGridViewへ書き込み
    		    Me.DataGridView1.Rows.Add()
    		    For j = 0 To table.Columns.Count - 1
    			'DataGridViewへの値埋め
    			Me.DataGridView1(j, i + k).Value = table.Rows(i).Item(table.Columns.Item(j).ColumnName).ToString
    		    Next
    
    		    '最終行に達した場合の処理。(最終行は比較が無く、無視されるために追加)
    		    If i = table.Rows.Count - 1 Then
    			DataGridView1.RowTemplate.DefaultCellStyle.BackColor = Color.Gray
    			Me.DataGridView1.Rows.Add()
    			DataGridView1.RowTemplate.DefaultCellStyle.BackColor = Nothing
    			Me.DataGridView1(1, i + k + 1).Value = currentColumnName & "(小計):" & subTotal
    		    End If
    
    		Next
    		table = Nothing
    	End Sub
    End Class
    
    <<メモ>>
    おおまかな内容
    1. データソース内のテーブルからビューを作成
    2. ビューを指定した「キー」でソート
    3. ソートしたビューをテーブルに変換
    4. テーブルを一行目からループ処理
    5. 読んだ行の「キー」が前回と同じ場合、subTotalにsubTotalColumnNameで指定した列を足す。
      読んだ行の「キー」が前回と異なる場合、変数「k=k+1」して行挿入
    6. 処理中のtableのカレント行をDataGridViewへ書き込む