AAA
今回は、以下のようなデータをソートして、小計行を挿入します。
|
⇒ |
|
- フォームのコードを書きます
'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
<<メモ>>
おおまかな内容
- データソース内のテーブルからビューを作成
- ビューを指定した「キー」でソート
- ソートしたビューをテーブルに変換
- テーブルを一行目からループ処理
読んだ行の「キー」が前回と同じ場合、subTotalにsubTotalColumnNameで指定した列を足す。
読んだ行の「キー」が前回と異なる場合、変数「k=k+1」して行挿入
- 処理中のtableのカレント行をDataGridViewへ書き込む