DataViewについて勉強しています。
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.dataview.find?view=net-6.0#system-data-dataview-find(system-object())
のページに次のコードがかかれています。
Private Sub FindValueInDataView(table As DataTable)
Dim view As New DataView(table)
view.Sort = "Customers"
Dim vals(1) As Object
vals(0)= "John"
vals(1) = "Smith"
Dim i As Integer = view.Find(vals)
Console.WriteLine(view(i))
End Sub
これを参考に次のコードを作成しました。
Dim myTable As New DataTable
Dim myColumn As DataColumn
myColumn = New DataColumn("FirstName")
myTable.Columns.Add(myColumn)
myColumn = New DataColumn("LastName")
myTable.Columns.Add(myColumn)
Dim myRow As DataRow
myRow = myTable.NewRow
myRow.ItemArray = New Object() {"佐々木", "渉"}
myTable.Rows.Add(myRow)
myRow = myTable.NewRow
myRow.ItemArray = New Object() {"山本", "健司"}
myTable.Rows.Add(myRow)
myRow = myTable.NewRow
myRow.ItemArray = New Object() {"山本", "弘子"}
myTable.Rows.Add(myRow)
myRow = myTable.NewRow
myRow.ItemArray = New Object() {"森本", "武"}
myTable.Rows.Add(myRow)
Dim myDataView As New DataView(myTable)
myDataView.Sort = "FirstName"
Dim test = myDataView.FindRows(New Object() {"山本", "健司"}) '@
'Dim test = myDataView.FindRows("山本") 'A
'DataGridView1.DataSource = test 'A
を作成しました。
実行してみると、「System.ArgumentException: 'インデックスを付加するキーには 1 値が必要ですが、2 値を取得しました。'」の例外が発生します。
サンプルコードとどこが違うのでしょうか?
サンプルのコードが正しく動いた場合は、一つの列の値の中で、二つのKYのどちらかがマッチした場合の行が返されると考えて宜しいのでしょうか?
また、@をコメントアウトして、Aをコメントを外すと例外は発生しませんが、
DataGridViewに期待する内容が表示されません。
DataRowView[]をDataGridViewに表示するには、どのようにすれば良いのでしょうか?
どなたか詳しい方教えてください。
宜しくお願い致します。
Dim myTable As New DataTable() myTable.Columns.Add("FirstName") myTable.Columns.Add("LastName") myTable.Rows.Add("佐々木", "渉") myTable.Rows.Add("山本", "健司") myTable.Rows.Add("山本", "弘子") myTable.Rows.Add("佐々木", "渉") myTable.Rows.Add("森本", "武") myTable.AcceptChanges() Dim myDataView As New DataView(myTable) With {.Sort = "FirstName"}
> 'Dim test = myDataView.FindRows("山本") 'A myDataView.Sort = "FirstName" が初期値として設定されていたためです。
> Dim test = myDataView.FindRows(New Object() {"山本", "健司"}) '@ 2 つの値で取り出すなら、並び替えも 2 値でなければなりません。 myDataView.Sort = "[FirstName] ASC, [LastName] ASC"
DataViewにLINQを使う時に、私ならつい From r As DataRowView In myDataView.Rows とRowsをつけてしまいそうですが、LINQ to DataSetの仕様という事でしょうか? また、r("FirstName")とColumn名が使えるのもLINQ to DataSetの仕様でしょうか?
魔界の仮面弁士さんのコードに.ToArrayをつけて
DataSouceに入れると図のようになってしまいます。
Dim myDataView As New DataView(myTable) With {.Sort = "FirstName"}
Dim test = myDataView.FindRows("山本").ToArray 'A
DataGridView1.DataSource = test 'A
宜しくお願い致します。