VB.NETのDataTableの行列を入れ替えるサンプルプログラムです。
利用する頻度が高いのに、インターネットで検索しても見つかりませんでした。
簡単なロジックなので、サンプルで紹介するほどの内容ではないのかもしれませんが、参考にしていただければと思います。
即席で作成したので、雑な関数になっています…
実行結果
CDataTable.vb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
''' <summary> ''' DataTable関連の操作クラス ''' </summary> Public Class CDataTable Public Sub New() End Sub ''' <summary> ''' DataTableの行列の入れ替え ''' </summary> ''' <param name="src">元のDataTable</param> ''' <param name="newColName">行列入れ替え後の最初のカラム名</param> ''' <returns>行列入れ替え後のDataTable</returns> Public Function SwapXY(ByVal src As DataTable, ByVal newColName As String) As DataTable Dim ret As New DataTable(src.TableName) '列の追加 ret.Columns.Add(newColName) For y As Integer = 0 To src.Rows.Count - 1 ret.Columns.Add(src.Rows(y)(0)) Next '列を行に変換 For x As Integer = 1 To src.Columns.Count - 1 Dim dr As DataRow = ret.NewRow() dr(newColName) = src.Columns(x).ColumnName For y As Integer = 0 To src.Rows.Count - 1 dr(ret.Columns(y + 1).ColumnName) = src.Rows(y)(x) Next ret.Rows.Add(dr) Next SwapXY = ret End Function End Class |
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Public Class FormGrid Private Sub FormGrid_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.DataGridViewSrc.DataSource = CreateDataSet() Dim cst As New CDataTable() Me.DataGridViewDest.DataSource = cst.SwapXY(Me.DataGridViewSrc.DataSource, "年度") End Sub Private Sub FormGrid_Closed(sender As Object, e As EventArgs) Handles Me.Closed FormMenu.Close() End Sub Private Function CreateDataSet() As DataTable Dim ds As New DataSet() Dim dt As DataTable dt = ds.Tables.Add("sample") dt.Columns.Add("店舗") dt.Columns.Add("2017年") dt.Columns.Add("2018年") dt.Columns.Add("2019年") dt.Rows.Add({1, 100, 110, 120}) dt.Rows.Add({2, 200, 210, 220}) dt.Rows.Add({3, 300, 310, 320}) dt.Rows.Add({4, 400, 410, 420}) dt.Rows.Add({5, 500, 510, 520}) CreateDataSet = dt End Function End Class |