グラフの作成(行列入替え)
今回作成する画面
画像拡大
見ていただいてわかる通り、フォーム下段のDataGridViewをグラフにしています。
DataGridView上ではこのように見たい。
しかし、このDataGridViewの形式のデータでは、グラフ化するのに行列が逆。
DataGridViewとは別にグラフ用のDataViewを作って…としても良いが、SQLを複数考えるのも面倒だし…
ということで、グラフに与えるデータで行列を入替えます。
※ついでに、データ検索時のフィルタも表現します。
Public Class Form1
Private Sub dataFilter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Control_商品名.TextChanged
'グラフデータのクリア
Chart1.Series.Clear()
'■■■■■ 検索フィルター Start ■■■■■
'検索用コンボボックスの値取得、フィルター設定
If Me.ComboBox1.Text <> "" Then
Me.SALESBindingSource.Filter = "商品名 = '" & Me.ComboBox1.Text & "'"
Else
Me.SALESBindingSource.Filter = ""
End If
'■■■■■ 検索フィルター End ■■■■■
'フィルター後のデータ件数
Dim FilDataCount As Integer = Me.SALESBindingSource.Count
'■■■■■ 系列名の配列作成 Start ■■■■■
Dim seriesName(200) 'グラフ上の系列データ
Dim n = 0
'DataGridView上の[商品名]列名を配列に取得しつつ、グラフ上の系列名に設定
For Each row As DataRowView In Me.SALESBindingSource
If FilDataCount <= 200 Then
seriesName(n) = row.Item("商品名").ToString
Chart1.Series.Add(seriesName(n))
n = n + 1
End If
Next
'■■■■■ 系列名の配列作成 End ■■■■■
'DataGridView上の列数取得
Dim XDataCount = Me.SALESDataGridView.Columns.Count
If FilDataCount <> 0 And FilDataCount <= 200 Then
For i As Integer = 0 To FilDataCount - 1
'系列毎にグラフの種類を設定
Chart1.Series(seriesName(i)).ChartType = DataVisualization.Charting.SeriesChartType.Line
For j As Integer = 1 To (XDataCount) - 1
'列名取得
Dim currentColumnNameJ = Me.SALESDataGridView.Columns(j).HeaderText.ToString
'データ取得
Dim YVal As String = Me.SALESDataGridView.Rows(i).Cells(Me.SALESDataGridView.Columns(j).Name).Value.ToString
'If InStr(mainDv.Table.Columns(j).ColumnName, "20") <> 0 Then
'データをグラフに当てはめる
Chart1.Series(seriesName(i)).Points.AddXY(currentColumnNameJ, YVal)
'End If
Next j
Next i
End If
'グラフの更新
Me.Chart1.DataBind()
End Sub
End Class
まず、フィルター機能でデータの絞り込みとDataGridViewの更新を行います。
グラフへは、DataGridViewからデータを取得しています。
その他、DataGridViewからデータを取得する以外にDataViewを使用して、ここからデータ取得でも可。
近く、追記する予定です。