ラベル LINQ の投稿を表示しています。 すべての投稿を表示
ラベル LINQ の投稿を表示しています。 すべての投稿を表示

■ VisualBasic+WPF+YAML #10:DataGridのイベント 3

VBからYMALファイルを読み込みたい。
前回記事:VisualBasic+WPF+YAML #9:DataGridのイベント 2



イベントのパラメータ

DataGridからButtonをクリックした際、Commandオブジェクトではパラメータが1つしか受け取れないため、
(複数パラメータを受け取る方法は存在する筈だがうまく行っていない)
とりあえずはキーとなる項目(id)を渡し、Commandオブジェクト側(ViewModel側)でModel(TestData)より対象データを抽出することで対処する。

ClickEventCommandクラスでid値は取得できるところまでは出来ている。
さてこれからどうするか?
いい案が浮かばないが、ClickEventCommandからViewModelへイベント(ShowMessageイベント)を通知することにする。
■ClickEventCommand.vb
Public Class ClickEventCommand
    Implements ICommand

    Public Event ShowMessage(id As Integer)

    Public Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged

    Public Sub Execute(parameter As Object) Implements ICommand.Execute
        RaiseEvent ShowMessage(parameter)
    End Sub
    :

ViewModelでは、_ClickEventオブジェクトをWithEvents付きに変更、
ShowMessageイベントを受信できるようにする。
Public Class ViewModel

    Public Property Model As New TestData()

    Private WithEvents _ClickEvent As ClickEventCommand
    Public ReadOnly Property ClickEvent As ClickEventCommand
        Get
            If (_ClickEvent Is Nothing) Then
                _ClickEvent = New ClickEventCommand()
            End If
            Return _ClickEvent
        End Get
    End Property

    Private Sub _ClickEvent_ShowMessage(id As Integer) Handles _ClickEvent.ShowMessage
        MessageBox.Show(id)
    End Sub

End Class

プログラムを実行、ボタンClickでクリックした行のidがメッセージボックスで表示されることを確認。

LINQを使ってアイテムを抽出

ViewModeでクリック行のidが取得できたので、この値を元にModel(TestDataクラス)の対象アイテム(ItemDataクラス)を取得してみる。
せっかくなのでLINQというのを使ってみる。
LINQはまだ学習し始めなので雑に言うと「From x In 配列 Where 条件 x.id = id」のように書く。
xの名前は何でも良く、配列から抽出した1要素を表し、In に続き配列(コレクション)、Whereに条件を指定。
結果はコレクションで返る。

ということで、id値よりitemsを検索し、見つかったnameを表示させてみる。
■ViewModel.vb
    Private Sub _ClickEvent_ShowMessage(id As Integer) Handles _ClickEvent.ShowMessage
        Dim Result = From x In Model.items Where x.id = id

        For Each Item In Result
            MessageBox.Show(Item.name)
        Next

    End Sub
プログラムを実行し、クリック行のname値がメッセージボックスで表示されることを確認。

ちなみに、LINQは次のように書くこともできる。
    ' Dim Result = From x In Model.items Where x.id = id
    Dim Result = Model.items.Where(Function(x) x.id = id)

ついでに 選択欄のチェックした個数も表示させてみる。
    Private Sub _ClickEvent_ShowMessage(id As Integer) Handles _ClickEvent.ShowMessage
        Dim Result = From x In Model.items Where x.id = id
        Dim CheckedCount = (From x In Model.items Where x.checked = True).Count()

        For Each Item In Result
            MessageBox.Show(Item.name & " チェック数:" & CheckedCount)
        Next

    End Sub

しかし、チェックを外そうが付けようが常に "チェック数:2" となってしまう・・・



次回記事:VisualBasic+WPF+YAML #11:DataGridのイベント 4

-- 以上 --


VisualBasic, WPF, DataGrid, YAML, MVVM, LINQ

■ Link:Visual StudioでDB連携も簡単プログラミング ~知っておきたいLINQメソッド式&ラムダ式

Visual StudioでDB連携も簡単プログラミング ~知っておきたいLINQメソッド式&ラムダ式



-- 以上 --


学習リンク, LINQ

■ 用語:LINQ

統合言語クエリ - Wikipedia

LINQ
Language INtegrated Query
統合言語クエリ
読み:りんく


様々な種類のデータ集合に対して標準化された方法でデータを問い合わせることを可能にする機能
配列などの集合に対して標準化された方法でデータの問い合わせを行う機能
ループなどを書かなくても、SQLっぽい記述で問い合わせができる。

Googleで "LINQ" と検索すると、アイドルグループが先頭にヒットするので注意

-- 以上 --


用語, LINQ

その他の記事