2013年11月27日水曜日

【VB.NET】DataView.ToTable 抽出した行から新しいDataTableを作成

DataViewのToTableで抽出した行を基に新しいDataTableを作成します。

  • DataView.ToTable()
    DataViewで抽出した行を基に新しいDataTableを作成します。
  • DataView.ToTable(TableName)
    DataViewで抽出した行を基に新しいテーブル名でDataTableを作成します。
      TableName‥新しいテーブル名
  • DataView.ToTable(Distinct,ColumnName())
    DataViewで抽出した行を基に重複した行を排除し新しいDataTableを作成します。
      DistinctTrue:重複した行を排除する False
    重複した行を排除しない
      ColumnName()‥新しいテーブルに含まれる列名の配列
  • DataView.ToTable(TableName,Distinct,ColumnName())
    DataViewで抽出した行を基に重複した行を排除し新しい名前でDataTableを作成します。
      TableName‥新しいテーブル名
      DistinctTrue:重複した行を排除する False
    重複した行を排除しない
      ColumnName()‥新しいテーブルに含まれる列名の配列
以下使用例です。
フォームにコントロールを配置
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'サンプルデータテーブル
        Dim sampleTable As New DataTable
        sampleTable.TableName = "SampleTable"
        sampleTable.Columns.Add("ItemCD", Type.GetType("System.String"))
        sampleTable.Columns.Add("ItemName", Type.GetType("System.String"))
        sampleTable.Columns.Add("Price", Type.GetType("System.Double"))
        sampleTable.Columns.Add("UnitSales", Type.GetType("System.Double"))
        sampleTable.Columns.Add("SalesAmount", Type.GetType("System.Double"))
 
        sampleTable.Rows.Add("001", "商品001", 100, 8, 100 * 8)
        sampleTable.Rows.Add("003", "商品003", 130, 5, 130 * 5)
        sampleTable.Rows.Add("001", "商品001", 100, 3, 100 * 3)
        sampleTable.Rows.Add("002", "商品002", 120, 6, 120 * 6)
        sampleTable.Rows.Add("002", "商品002", 120, 5, 120 * 5)
        sampleTable.Rows.Add("003", "商品003", 130, 7, 130 * 7)
        sampleTable.Rows.Add("003", "商品003", 130, 1, 130 * 1)
        sampleTable.Rows.Add("002", "商品002", 120, 3, 120 * 3)
        sampleTable.Rows.Add("001", "商品001", 100, 9, 100 * 9)
 
        'SampleTableの表示
        Me.DataGridView1.DataSource = sampleTable
 
        'DataViewを設定
        Dim dv As New DataView(sampleTable)
 
        '行を抽出
        dv.RowFilter = "ItemCD = '001' Or ItemCD = '003'"
 
        'DataViewを表示
        Me.DataGridView1.DataSource = dv
 
        '抽出された行で新しいDataTableを作成
        Dim newTable1 As DataTable = dv.ToTable()
        Me.DataGridView2.DataSource = newTable1
 
        '列を指定し重複した行の排除なしで新しいDataTableを作成
        Dim newTable2 As DataTable = dv.ToTable(False, "ItemCD")
        Me.DataGridView3.DataSource = newTable2
 
        '列を指定し重複した行を排除して新しい名前のDataTableを作成
        Dim newTable3 As DataTable = dv.ToTable("NewTable", True, "ItemCD", "ItemName")
        Me.DataGridView4.DataSource = newTable3
 
    End Sub
End Class
実行結果

【VB.NET】DataTableのコピー

DataTableのコピーです。

  1. DataTable.Clone
    DataTableのスキーム(構成)のみをコピーします。コピー元の空のテーブルが作られます。
  2. DataTable.Copy元のテーブルをデータごとコピーします。
  3. DataTable.Select(filter).CopyToDataTable
    抽出したデータをテーブルにコピーします。
以下使用例です。
フォームにコントロールを配置

Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        'サンプルデータテーブル
        Dim sampleTable As New DataTable
        sampleTable.Columns.Add("ItemCD", Type.GetType("System.String"))
        sampleTable.Columns.Add("ItemName", Type.GetType("System.String"))
        sampleTable.Columns.Add("Price", Type.GetType("System.Double"))
        sampleTable.Columns.Add("UnitSales", Type.GetType("System.Double"))
        sampleTable.Columns.Add("SalesAmount", Type.GetType("System.Double"))
 
        sampleTable.Rows.Add("001", "商品001", 100, 8, 100 * 8)
        sampleTable.Rows.Add("003", "商品003", 130, 5, 130 * 5)
        sampleTable.Rows.Add("001", "商品001", 100, 3, 100 * 3)
        sampleTable.Rows.Add("002", "商品002", 120, 6, 120 * 6)
        sampleTable.Rows.Add("002", "商品002", 120, 5, 120 * 5)
        sampleTable.Rows.Add("003", "商品003", 130, 7, 130 * 7)
        sampleTable.Rows.Add("003", "商品003", 130, 1, 130 * 1)
        sampleTable.Rows.Add("002", "商品002", 120, 3, 120 * 3)
        sampleTable.Rows.Add("001", "商品001", 100, 9, 100 * 9)
 
        'サンプルデータテーブルを表示
        Me.DataGridView1.DataSource = sampleTable
 
        'サンプルデータテーブルのClone
        Dim newTable1 As DataTable = sampleTable.Clone
        Me.DataGridView2.DataSource = newTable1
 
        'サンプルデータテーブルのCopy
        Dim newTable2 As DataTable = sampleTable.Copy
        Me.DataGridView3.DataSource = newTable2
 
        'サンプルデータテーブルから抽出したデータをテーブルへCopy
        Dim newTable3 As DataTable = sampleTable.Select("ItemCD = '001'").CopyToDataTable
        Me.DataGridView4.DataSource = newTable3
 
    End Sub
End Class
実行結果

2013年11月24日日曜日

【VB.NET】Computeメソッドで列の集計

DataTable.Computeメソッドで列の集計をします。
Dim obj As Object = dtSample.Compute(expression , filter )
expression‥計算式、filter ‥抽出条件


使用例
フォームにコントロールを配置
Public Class Form1
 
    ''' <summary>
    ''' サンプルデータテーブル
    ''' </summary>
    ''' <remarks></remarks>
    Private dtSample As New DataTable
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        'サンプルデータテーブル
        dtSample.Columns.Add("ItemCD", Type.GetType("System.String"))
        dtSample.Columns.Add("ItemName", Type.GetType("System.String"))
        dtSample.Columns.Add("Price", Type.GetType("System.Double"))
        dtSample.Columns.Add("UnitSales", Type.GetType("System.Double"))
        dtSample.Columns.Add("SalesAmount", Type.GetType("System.Double"))
 
        dtSample.Rows.Add("001", "商品001", 100, 8, 100 * 8)
        dtSample.Rows.Add("003", "商品003", 130, 5, 130 * 5)
        dtSample.Rows.Add("001", "商品001", 100, 3, 100 * 3)
        dtSample.Rows.Add("002", "商品002", 120, 6, 120 * 6)
        dtSample.Rows.Add("002", "商品002", 120, 5, 120 * 5)
        dtSample.Rows.Add("003", "商品003", 130, 7, 130 * 7)
        dtSample.Rows.Add("003", "商品003", 130, 1, 130 * 1)
        dtSample.Rows.Add("002", "商品002", 120, 3, 120 * 3)
        dtSample.Rows.Add("001", "商品001", 100, 9, 100 * 9)
 
        'Me.BindingSource1のDataSource設定
        Me.BindingSource1.DataSource = dtSample
 
        'Me.BindingSource1をDataGridView1へ連結
        Me.DataGridView1.DataSource = Me.BindingSource1
 
        'コンボボックス
        With Me.ComboBox1
            .Items.Add("")
            .Items.Add("001")
            .Items.Add("002")
            .Items.Add("003")
            .SelectedItem = ""
        End With
 
    End Sub
 
    ''' <summary>
    ''' SelectedIndexが変更された時
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
 
        '抽出条件
        Dim strFilter As String = Nothing
 
        '抽出条件の設定
        If Not Me.ComboBox1.SelectedItem = "" Then
            strFilter = "ItemCD = '" & Me.ComboBox1.SelectedItem & "'"
        End If
 
        'データ抽出"
        Me.BindingSource1.Filter = strFilter
 
        'SalesAmountの合計
        Me.TextBox1.Text = dtSample.Compute("SUM(SalesAmount)", strFilter).ToString
 
        'SalesAmountの平均
        Me.TextBox2.Text = Math.Round(dtSample.Compute("AVG(SalesAmount)", strFilter)).ToString
 
        'SalesAmountの最大値
        Me.TextBox3.Text = dtSample.Compute("MAX(SalesAmount)", strFilter).ToString
 
        'SalesAmountの最小値
        Me.TextBox4.Text = dtSample.Compute("MIN(SalesAmount)", strFilter).ToString
 
        'SalesAmountの行数
        Me.TextBox5.Text = dtSample.Compute("COUNT(SalesAmount)", strFilter).ToString
    End Sub
End Class
実行結果

【VB.NET】BindingNavigatorでフォームのレコードを操作する

BindingNavigatorでフォームのコントロールに連結されたデータレコードの移動や追加・削除といった操作ができます。

フォームにコントロールとBindingSource、BindingNavigatorを配置します。

BindingSourceを各コントロールとBindingNavigatorに連結します。
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'サンプルデータテーブル
        Dim dt As New DataTable
        dt.Columns.Add("商品CD", Type.GetType("System.String"))
        dt.Columns.Add("商品名", Type.GetType("System.String"))
        dt.Columns.Add("単価", Type.GetType("System.Double"))
 
        For i = 1 To 20
            Dim nr As DataRow = dt.NewRow
            nr("商品CD") = i.ToString("000")
            nr("商品名") = "商品" & i.ToString("000")
            nr("単価") = i * 100
            dt.Rows.Add(nr)
        Next
 
        'BindingSource1のDataSourceを設定
        Me.BindingSource1.DataSource = dt
 
        'BindingSource1をBindingNavigator1と連結
        Me.BindingNavigator1.BindingSource = Me.BindingSource1
 
        'BindingSource1を各TextBoxと連結
        Me.TextBox1.DataBindings.Add(New Binding("Text", Me.BindingSource1, "商品CD"))
        Me.TextBox2.DataBindings.Add(New Binding("Text", Me.BindingSource1, "商品名"))
        Me.TextBox3.DataBindings.Add(New Binding("Text", Me.BindingSource1, "単価"))
 
        'BindingSource1をDataGridView1と連結
        Me.DataGridView1.DataSource = Me.BindingSource1
    End Sub
End Class
実行結果

2013年11月21日木曜日

【VB.NET】DataTableの並び替え

DataTableの行の抽出の引数またはプロパティに["列名 ソート方向"]を設定する。
ソート方向 ASC(省略可)‥昇順
        DESC‥降順

DataTable.Selectメソッドを使っての並び替え
Module Module1
 
    Sub Main()
        'サンプルデータテーブル
        Dim dt As New DataTable
        dt.Columns.Add("NO", Type.GetType("System.Double"))
        dt.Columns.Add("CATEGORY1", Type.GetType("System.String"))
        dt.Columns.Add("NAME", Type.GetType("System.String"))
        dt.Columns.Add("VAL1", Type.GetType("System.Double"))
 
        dt.Rows.Add("0", "分類00", "名前0000", 15)
        dt.Rows.Add("1", "分類00", "名前0001", 23)
        dt.Rows.Add("2", "分類00", "名前0002", 75)
        dt.Rows.Add("3", "分類00", "名前0003", 0)
        dt.Rows.Add("4", "分類00", "名前0004", 69)
        dt.Rows.Add("5", "分類00", "名前0005", 45)
        dt.Rows.Add("6", "分類01", "名前0100", 96)
        dt.Rows.Add("7", "分類01", "名前0101", 12)
        dt.Rows.Add("8", "分類01", "名前0102", 69)
        dt.Rows.Add("9", "分類01", "名前0103", 2)
        dt.Rows.Add("10", "分類01", "名前0104", 2)
        dt.Rows.Add("11", "分類01", "名前0105", 18)
        dt.Rows.Add("12", "分類02", "名前0200", 8)
        dt.Rows.Add("13", "分類02", "名前0201", 72)
        dt.Rows.Add("14", "分類02", "名前0202", 95)
        dt.Rows.Add("15", "分類02", "名前0203", 55)
        dt.Rows.Add("16", "分類02", "名前0204", 22)
        dt.Rows.Add("17", "分類02", "名前0205", 99)
        dt.Rows.Add("18", "分類03", "名前0300", 74)
        dt.Rows.Add("19", "分類03", "名前0301", 51)
        dt.Rows.Add("20", "分類03", "名前0302", 68)
        dt.Rows.Add("21", "分類03", "名前0303", 18)
        dt.Rows.Add("22", "分類03", "名前0304", 99)
        dt.Rows.Add("23", "分類03", "名前0305", 37)
 
        'データを抽出
        Dim rws() As DataRow = dt.Select("CATEGORY1 = '分類02'", "VAL1 ASC")
 
        '抽出したデータを出力
        For i = 0 To rws.Count - 1
            Dim str As String = Nothing
            For j = 0 To dt.Columns.Count - 1
                str = str & rws(i)(j).ToString & " "
            Next
            Console.WriteLine(str)
        Next
    End Sub
 
End Module
実行結果
DataViewを使っての並び替え
Module Module1
 
    Sub Main()
        'サンプルデータテーブル
        Dim dt As New DataTable
        dt.Columns.Add("NO", Type.GetType("System.Double"))
        dt.Columns.Add("CATEGORY1", Type.GetType("System.String"))
        dt.Columns.Add("NAME", Type.GetType("System.String"))
        dt.Columns.Add("VAL1", Type.GetType("System.Double"))
 
        dt.Rows.Add("0", "分類00", "名前0000", 15)
        dt.Rows.Add("1", "分類00", "名前0001", 23)
        dt.Rows.Add("2", "分類00", "名前0002", 75)
        dt.Rows.Add("3", "分類00", "名前0003", 0)
        dt.Rows.Add("4", "分類00", "名前0004", 69)
        dt.Rows.Add("5", "分類00", "名前0005", 45)
        dt.Rows.Add("6", "分類01", "名前0100", 96)
        dt.Rows.Add("7", "分類01", "名前0101", 12)
        dt.Rows.Add("8", "分類01", "名前0102", 69)
        dt.Rows.Add("9", "分類01", "名前0103", 2)
        dt.Rows.Add("10", "分類01", "名前0104", 2)
        dt.Rows.Add("11", "分類01", "名前0105", 18)
        dt.Rows.Add("12", "分類02", "名前0200", 8)
        dt.Rows.Add("13", "分類02", "名前0201", 72)
        dt.Rows.Add("14", "分類02", "名前0202", 95)
        dt.Rows.Add("15", "分類02", "名前0203", 55)
        dt.Rows.Add("16", "分類02", "名前0204", 22)
        dt.Rows.Add("17", "分類02", "名前0205", 99)
        dt.Rows.Add("18", "分類03", "名前0300", 74)
        dt.Rows.Add("19", "分類03", "名前0301", 51)
        dt.Rows.Add("20", "分類03", "名前0302", 68)
        dt.Rows.Add("21", "分類03", "名前0303", 18)
        dt.Rows.Add("22", "分類03", "名前0304", 99)
        dt.Rows.Add("23", "分類03", "名前0305", 37)
 
        'データを抽出
        Dim dv As New DataView(dt)
        dv.RowFilter = "CATEGORY1 = '分類03'"
        '並び替え
        dv.Sort = "VAL1 ASC"
 
        '抽出したデータを出力
        For i = 0 To dv.Count - 1
            Dim str As String = Nothing
            For j = 0 To dv.Table.Columns.Count - 1
                str = str & dv(i)(j).ToString & " "
            Next
            Console.WriteLine(str)
        Next
    End Sub
 
End Module
実行結果
BindingSourceを使っての並び替え
 フォームにDataGridView、BindingSourceを配置する
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        'サンプルデータテーブル
        Dim dt As New DataTable
        dt.Columns.Add("NO", Type.GetType("System.Double"))
        dt.Columns.Add("CATEGORY1", Type.GetType("System.String"))
        dt.Columns.Add("NAME", Type.GetType("System.String"))
        dt.Columns.Add("VAL1", Type.GetType("System.Double"))
 
        dt.Rows.Add("0", "分類00", "名前0000", 15)
        dt.Rows.Add("1", "分類00", "名前0001", 23)
        dt.Rows.Add("2", "分類00", "名前0002", 75)
        dt.Rows.Add("3", "分類00", "名前0003", 0)
        dt.Rows.Add("4", "分類00", "名前0004", 69)
        dt.Rows.Add("5", "分類00", "名前0005", 45)
        dt.Rows.Add("6", "分類01", "名前0100", 96)
        dt.Rows.Add("7", "分類01", "名前0101", 12)
        dt.Rows.Add("8", "分類01", "名前0102", 69)
        dt.Rows.Add("9", "分類01", "名前0103", 2)
        dt.Rows.Add("10", "分類01", "名前0104", 2)
        dt.Rows.Add("11", "分類01", "名前0105", 18)
        dt.Rows.Add("12", "分類02", "名前0200", 8)
        dt.Rows.Add("13", "分類02", "名前0201", 72)
        dt.Rows.Add("14", "分類02", "名前0202", 95)
        dt.Rows.Add("15", "分類02", "名前0203", 55)
        dt.Rows.Add("16", "分類02", "名前0204", 22)
        dt.Rows.Add("17", "分類02", "名前0205", 99)
        dt.Rows.Add("18", "分類03", "名前0300", 74)
        dt.Rows.Add("19", "分類03", "名前0301", 51)
        dt.Rows.Add("20", "分類03", "名前0302", 68)
        dt.Rows.Add("21", "分類03", "名前0303", 18)
        dt.Rows.Add("22", "分類03", "名前0304", 99)
        dt.Rows.Add("23", "分類03", "名前0305", 37)
 
        'BindingSource1のDataSource設定
        Me.BindingSource1.DataSource = dt
 
        'データの抽出
        Me.BindingSource1.Filter = "CATEGORY1 = '分類01'"
 
        'データの並び替え
        Me.BindingSource1.Sort = "VAL1 ASC"
 
        'DataGridView1のDataSource設定
        Me.DataGridView1.DataSource = Me.BindingSource1
 
    End Sub
 
End Class
実行結果

2013年11月17日日曜日

【VB.NET】DataTableの行の抽出

DataTable.Selectメソッドを使っての抽出
Module Module1
 
    Sub Main()
        'サンプルデータテーブル
        Dim dt As New DataTable
        dt.Columns.Add("NO", Type.GetType("System.Double"))
        dt.Columns.Add("CATEGORY1", Type.GetType("System.String"))
        dt.Columns.Add("NAME", Type.GetType("System.String"))
        dt.Columns.Add("VAL1", Type.GetType("System.Double"))
 
        dt.Rows.Add("0", "分類00", "名前0000", 15)
        dt.Rows.Add("1", "分類00", "名前0001", 23)
        dt.Rows.Add("2", "分類00", "名前0002", 75)
        dt.Rows.Add("3", "分類00", "名前0003", 0)
        dt.Rows.Add("4", "分類00", "名前0004", 69)
        dt.Rows.Add("5", "分類00", "名前0005", 45)
        dt.Rows.Add("6", "分類01", "名前0100", 96)
        dt.Rows.Add("7", "分類01", "名前0101", 12)
        dt.Rows.Add("8", "分類01", "名前0102", 69)
        dt.Rows.Add("9", "分類01", "名前0103", 2)
        dt.Rows.Add("10", "分類01", "名前0104", 2)
        dt.Rows.Add("11", "分類01", "名前0105", 18)
        dt.Rows.Add("12", "分類02", "名前0200", 8)
        dt.Rows.Add("13", "分類02", "名前0201", 72)
        dt.Rows.Add("14", "分類02", "名前0202", 95)
        dt.Rows.Add("15", "分類02", "名前0203", 55)
        dt.Rows.Add("16", "分類02", "名前0204", 22)
        dt.Rows.Add("17", "分類02", "名前0205", 99)
        dt.Rows.Add("18", "分類03", "名前0300", 74)
        dt.Rows.Add("19", "分類03", "名前0301", 51)
        dt.Rows.Add("20", "分類03", "名前0302", 68)
        dt.Rows.Add("21", "分類03", "名前0303", 18)
        dt.Rows.Add("22", "分類03", "名前0304", 99)
        dt.Rows.Add("23", "分類03", "名前0305", 37)
 
        'データを抽出
        Dim rws() As DataRow = dt.Select("CATEGORY1 = '分類02'")
 
        '抽出したデータを出力
        For i = 0 To rws.Count - 1
            Dim str As String = Nothing
            For j = 0 To dt.Columns.Count - 1
                str = str & rws(i)(j).ToString & " "
            Next
            Console.WriteLine(str)
        Next
    End Sub
 
End Module
実行結果
DataViewを使っての抽出
Module Module1
 
    Sub Main()
        'サンプルデータテーブル
        Dim dt As New DataTable
        dt.Columns.Add("NO", Type.GetType("System.Double"))
        dt.Columns.Add("CATEGORY1", Type.GetType("System.String"))
        dt.Columns.Add("NAME", Type.GetType("System.String"))
        dt.Columns.Add("VAL1", Type.GetType("System.Double"))
 
        dt.Rows.Add("0", "分類00", "名前0000", 15)
        dt.Rows.Add("1", "分類00", "名前0001", 23)
        dt.Rows.Add("2", "分類00", "名前0002", 75)
        dt.Rows.Add("3", "分類00", "名前0003", 0)
        dt.Rows.Add("4", "分類00", "名前0004", 69)
        dt.Rows.Add("5", "分類00", "名前0005", 45)
        dt.Rows.Add("6", "分類01", "名前0100", 96)
        dt.Rows.Add("7", "分類01", "名前0101", 12)
        dt.Rows.Add("8", "分類01", "名前0102", 69)
        dt.Rows.Add("9", "分類01", "名前0103", 2)
        dt.Rows.Add("10", "分類01", "名前0104", 2)
        dt.Rows.Add("11", "分類01", "名前0105", 18)
        dt.Rows.Add("12", "分類02", "名前0200", 8)
        dt.Rows.Add("13", "分類02", "名前0201", 72)
        dt.Rows.Add("14", "分類02", "名前0202", 95)
        dt.Rows.Add("15", "分類02", "名前0203", 55)
        dt.Rows.Add("16", "分類02", "名前0204", 22)
        dt.Rows.Add("17", "分類02", "名前0205", 99)
        dt.Rows.Add("18", "分類03", "名前0300", 74)
        dt.Rows.Add("19", "分類03", "名前0301", 51)
        dt.Rows.Add("20", "分類03", "名前0302", 68)
        dt.Rows.Add("21", "分類03", "名前0303", 18)
        dt.Rows.Add("22", "分類03", "名前0304", 99)
        dt.Rows.Add("23", "分類03", "名前0305", 37)
 
        'データを抽出
        Dim dv As New DataView(dt)
        dv.RowFilter = "CATEGORY1 = '分類03'"
 
        '抽出したデータを出力
        For i = 0 To dv.Count - 1
            Dim str As String = Nothing
            For j = 0 To dv.Table.Columns.Count - 1
                str = str & dv(i)(j).ToString & " "
            Next
            Console.WriteLine(str)
        Next
    End Sub
 
End Module
実行結果
BindingSourceを使っての抽出
 フォームにDataGridView、BindingSourceを配置する
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        'サンプルデータテーブル
        Dim dt As New DataTable
        dt.Columns.Add("NO", Type.GetType("System.Double"))
        dt.Columns.Add("CATEGORY1", Type.GetType("System.String"))
        dt.Columns.Add("NAME", Type.GetType("System.String"))
        dt.Columns.Add("VAL1", Type.GetType("System.Double"))
 
        dt.Rows.Add("0", "分類00", "名前0000", 15)
        dt.Rows.Add("1", "分類00", "名前0001", 23)
        dt.Rows.Add("2", "分類00", "名前0002", 75)
        dt.Rows.Add("3", "分類00", "名前0003", 0)
        dt.Rows.Add("4", "分類00", "名前0004", 69)
        dt.Rows.Add("5", "分類00", "名前0005", 45)
        dt.Rows.Add("6", "分類01", "名前0100", 96)
        dt.Rows.Add("7", "分類01", "名前0101", 12)
        dt.Rows.Add("8", "分類01", "名前0102", 69)
        dt.Rows.Add("9", "分類01", "名前0103", 2)
        dt.Rows.Add("10", "分類01", "名前0104", 2)
        dt.Rows.Add("11", "分類01", "名前0105", 18)
        dt.Rows.Add("12", "分類02", "名前0200", 8)
        dt.Rows.Add("13", "分類02", "名前0201", 72)
        dt.Rows.Add("14", "分類02", "名前0202", 95)
        dt.Rows.Add("15", "分類02", "名前0203", 55)
        dt.Rows.Add("16", "分類02", "名前0204", 22)
        dt.Rows.Add("17", "分類02", "名前0205", 99)
        dt.Rows.Add("18", "分類03", "名前0300", 74)
        dt.Rows.Add("19", "分類03", "名前0301", 51)
        dt.Rows.Add("20", "分類03", "名前0302", 68)
        dt.Rows.Add("21", "分類03", "名前0303", 18)
        dt.Rows.Add("22", "分類03", "名前0304", 99)
        dt.Rows.Add("23", "分類03", "名前0305", 37)
 
        'BindingSource1のDataSource設定
        Me.BindingSource1.DataSource = dt
 
        'データの抽出
        Me.BindingSource1.Filter = "CATEGORY1 = '分類01'"
 
        'DataGridView1のDataSource設定
        Me.DataGridView1.DataSource = Me.BindingSource1
 
    End Sub
 
End Class
実行結果

2013年11月10日日曜日

【VB.NET】DataRowViewでDataGridViewの現在の行のDataRowの取得する。

DataRowViewを使いDataGridViewの現在の行(または任意の行)からソース元のDataTableのDataRowを取得します。
Dim dgr As System.Windows.Forms.DataGridViewRow = Me.DataGridView1.CurrentRow
Dim drv As System.Data.DataRowView = CType(dgr.DataBoundItem, System.Data.DataRowView)
Dim dr As DataRow = CType(drv.Row, System.Data.DataRow)
使用例:フォームにDataGridViewとButtonを配置します。
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        'サンプルデータテーブル
        Dim dt As New DataTable
        dt.Columns.Add("NO", Type.GetType("System.Double"))
        dt.Columns.Add("CATEGORY1", Type.GetType("System.String"))
        dt.Columns.Add("CATEGORY2", Type.GetType("System.String"))
        dt.Columns.Add("CATEGORY3", Type.GetType("System.String"))
        dt.Columns.Add("NAME", Type.GetType("System.String"))
        dt.Columns.Add("VAL1", Type.GetType("System.Double"))
        dt.Columns.Add("VAL2", Type.GetType("System.Double"))
        dt.Columns.Add("VAL3", Type.GetType("System.Double"))
        dt.Columns.Add("VAL4", Type.GetType("System.Double"))
        dt.Columns.Add("VAL5", Type.GetType("System.Double"))
 
        Dim r As New System.Random(1000)
 
        Dim no As Integer = 0
        For j1 = 0 To 100
            For j2 = 0 To 5
                For j3 = 0 To 3
                    Dim nr As DataRow = dt.NewRow
                    nr("NO") = no
                    nr("CATEGORY1") = "分類" & j1.ToString("00")
                    nr("CATEGORY2") = "分類" & j2.ToString("00")
                    nr("CATEGORY3") = "分類" & j3.ToString("00")
                    nr("NAME") = "名前" & j1.ToString("00") & j2.ToString("00") & j3.ToString("00")
                    nr("VAL1") = r.Next(10000)
                    nr("VAL2") = r.Next(10000)
                    nr("VAL3") = r.Next(10000)
                    nr("VAL4") = r.Next(10000)
                    nr("VAL5") = r.Next(10000)
                    dt.Rows.Add(nr)
 
                    no += 1
                Next
            Next
        Next
 
        Me.DataGridView1.DataSource = dt
 
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        Dim dgr As System.Windows.Forms.DataGridViewRow = Me.DataGridView1.CurrentRow
        Dim drv As System.Data.DataRowView = CType(dgr.DataBoundItem, System.Data.DataRowView)
        Dim dr As DataRow = CType(drv.Row, System.Data.DataRow)
 
        Console.WriteLine("---------------------------------------------------------")
        For i = 0 To dr.Table.Columns.Count - 1
            Console.WriteLine(dr.Table.Columns(i).ColumnName.ToString & " = " & dr.Item(i).ToString)
        Next
    End Sub
End Class
実行結果

2013年11月3日日曜日

記事を整理

ひとつのコントロールのコードを2つの記事に記載だと分かりづらいので、今までの記事を整理しました。

また【VB.NET】DataGridViewの列ヘッダーの2行表示のコード131~140行に間違いがありましたので修正しました。