DOBON.NETプログラミング道掲示板
(現在 過去ログ5 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■35075 / inTopicNo.1)  DataViewのFindRowsde
  
□投稿者/ Wan 付き人(62回)-(2022/06/15(Wed) 17:49:25)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    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に表示するには、どのようにすれば良いのでしょうか?
    どなたか詳しい方教えてください。
    宜しくお願い致します。
    
    
    
    

引用返信 削除キー/
■35076 / inTopicNo.2)  Re[1]: DataViewのFindRowsde
□投稿者/ Hongliang 大御所(629回)-(2022/06/15(Wed) 18:22:04)
  • アイコン// サンプルはFindRowsではなくFind……という茶々

    サンプルが間違っていますね。
    Find, FindRowsに渡すのは、Sortでソート列として指定されている列の値である必要があり、またこのソート列として指定されている列すべてを指定する必要があります。
    逆に言うと、Find, FindRowsに2要素を渡すなら、Sortは2列指定されている必要があります。
    .Sort = "Firstame, LastName"
    .FindRows(New Object() { "first", "last" })
引用返信 削除キー/
■35077 / inTopicNo.3)  Re[1]: DataViewのFindRowsde
□投稿者/ 魔界の仮面弁士 大御所(1428回)-(2022/06/15(Wed) 18:53:38)
  • アイコンNo35075に返信(Wanさんの記事)
    > これを参考に次のコードを作成しました。

    コードを圧縮してみました。

    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"


    > サンプルコードとどこが違うのでしょうか?
    こちらをご覧ください。
    https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/dataset-datatable-dataview/finding-rows

    | Find メソッドまたは FindRows メソッドを使用するには、
    | 並べ替え順序を指定する必要があります。
    | 並べ替え順序を指定するには、ApplyDefaultSort を true に設定するか、
    | または Sort プロパティを使用します。
    | 並べ替え順序が指定されないと、例外がスローされます。
引用返信 削除キー/
■35078 / inTopicNo.4)  Re[1]: DataViewのFindRowsde
□投稿者/ 魔界の仮面弁士 大御所(1429回)-(2022/06/15(Wed) 20:27:22)
  • アイコンNo35075に返信(Wanさんの記事)
    > 一つの列の値の中で、二つのKYのどちらかがマッチした場合の行が返されると考えて宜しいのでしょうか?

    FindRows メソッドでの検索は AND 条件です。
    OR 条件で抽出したい場合は、LINQ を使うことができます。

    Dim rowViews = (From r As DataRowView In myDataView Where r("FirstName") = "山本" OrElse r("LastName") = "健司").ToArray()
引用返信 削除キー/
■35079 / inTopicNo.5)  Re[2]: DataViewのFindRowsde
□投稿者/ Wan 付き人(63回)-(2022/06/16(Thu) 07:57:57)
  • アイコンHongliangさん
    魔界の仮面弁士さん

    いつもご指導ありがとうございます。
    サンプルでも間違えていることがあるんですね?
    色々やってみましたが、上手く行かず途方に暮れていました。
    助かりました。

    DataViewにLINQを使う時に、私ならつい
    From r As DataRowView In myDataView.Rows
    とRowsをつけてしまいそうですが、LINQ to DataSetの仕様という事でしょうか?
    また、r("FirstName")とColumn名が使えるのもLINQ to DataSetの仕様でしょうか?


    最後の質問である。
    DataRowView[]をDataGridViewに表示するには、どのようにすれば良いのでしょうか?
    は、どのようにすれば宜しいのでしょうか?
    追加で、ご指導頂ければ助かります。

引用返信 削除キー/
■35080 / inTopicNo.6)  Re[3]: DataViewのFindRowsde
□投稿者/ Wan 付き人(64回)-(2022/06/16(Thu) 08:05:30)
  • アイコン
    魔界の仮面弁士さんのコードに.ToArrayをつけて
    DataSouceに入れると図のようになってしまいます。
    
     Dim myDataView As New DataView(myTable) With {.Sort = "FirstName"}
     Dim test = myDataView.FindRows("山本").ToArray 'A
     DataGridView1.DataSource = test 'A
    
    宜しくお願い致します。
    

442×275 => 250×155
イメージ
dobon.jpg
/11KB
引用返信 削除キー/
■35081 / inTopicNo.7)  Re[4]: DataViewのFindRowsde
□投稿者/ Wan 付き人(65回)-(2022/06/16(Thu) 08:22:40)
  • アイコン.ToListならでました。
    根本的に?何を理解していないのか?
    わかりません?
引用返信 削除キー/
■35084 / inTopicNo.8)  Re[5]: DataViewのFindRowsde
□投稿者/ wan 一般人(5回)-(2022/06/16(Thu) 22:42:43)
  • アイコン解決しました
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -