ヴィジュアル、サウンド、テキスト、コードの間を彷徨いながら、感じたこと考えたことを綴ります。

Mango 対応 Silverlight 検索アプリケーションの作成(10)「一品検索」LINQ to XMLによるAND検索

»

Mango 対応 Silverlight 検索アプリケーションの作成、前回からの続きです。
今回で処理の完成です。

「一品検索」用データ、DailyMenu.xmlのダウンロードが完了した時の処理

ダウンロードが完了したら、「検索」と「検索文字列クリア」ボタンを使用可にします。これら2個のButtonは、XAML内では使用不可としています。

    Private Sub item3_DownloadCompleted(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
        Dim item3Data As String = e.Result
        item3Doc = XElement.Parse(item3Data)
        Button1.IsEnabled = True
        Button2.IsEnabled = True
    End Sub

「分類」選択ボックス(ListBox3)の項目が選択された時の処理

「分類」選択ボックス(ListBox3)の項目が選択された時、冒頭で宣言した変数cookKey(以前の記事参照)に、ListBox3のインデックスと同じCookKey.xml内の<key>要素の値を代入します。
「すべての分類」が選択された時は、特定の文字列で絞り込む必要はないため、分類を特定する検索キーを空にしておきます。それ以外の場合は、変数searchCookKeyに、選択された分類を指定します。

    Private Sub ListBox3_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox3.SelectionChanged

        '検索キー(分類)
        cookKey = SearchInfoDoc.Descendants("Key")(ListBox3.SelectedIndex).Value

        If cookKey = "すべての分類" Then
            searchCookKey = String.Empty
        Else
            searchCookKey = cookKey
        End If
    End Sub

Button1(「検索」ボタン)がクリックされた時の処理

Button1(「検索」ボタン)がクリックされた時、「追加したい食材」として、「肉・畜肉加工品」「魚介類・練り製品」「乳・乳製品」「卵・卵加工品」の4個のCheckBoxのうち、どれが選択されているかを、1か0かで表します。それらの連結した値を、変数searchIndexに代入します。searchIndexに代入されている値が「0000」の場合は、追加したい食材はないという意味になるため、検索キーのひとつである変数searchIndexNoの値は空にします。

    Private Sub Button1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click

        '検索キー(肉食用追加食材)

       If CheckBox1.IsChecked Then
            checkNo1 = "1"
        Else
            checkNo1 = "0"
        End If
        If CheckBox2.IsChecked Then
            checkNo2 = "1"
        Else
            checkNo2 = "0"
        End If
        If CheckBox3.IsChecked Then
            checkNo3 = "1"
        Else
            checkNo3 = "0"
        End If
        If CheckBox4.IsChecked Then
            checkNo4 = "1"
        Else
            checkNo4 = "0"
        End If
        searchIndex = checkNo1 & checkNo2 & checkNo3 & checkNo4

        If searchIndex = "0000" Then
            searchIndexNo = String.Empty
        Else
            searchIndexNo = searchIndex
        End If

TextBoxに入力されたキーワードを変数keywordに代入します。

        '検索キー(入力されたキーワード)

        keyword = TextBox1.Text

        '検索結果表示

<献立>要素の、子要素の値に指定されたキーワードが含まれ、<分類>要素に変数searchCookKeyの値が含まれ、"インデックス"属性値に変数searchIndexNoの値が含まれる場合の、<献立>要素を取得します。

        Dim searchQuery As IEnumerable(Of XElement) = From c In item3Doc.Elements("献立") Where c.Value.Contains(keyword) AndAlso c.<分類>.Value.Contains(searchCookKey) AndAlso c.@インデックス.Contains(searchIndexNo) Select c

<献立>要素の数を取得して、NameがresultNoであるTextBlockに、検索件数を表示します。

        Dim resultDish As Integer = searchQuery.Count
        resultNo.Text = "(" & resultDish & "件)"

検索結果が1件でもあれば、「検索結果」を表示し、「検索機能の使い方」を非表示にします。

        If searchQuery.Count > 0 Then
            resultDisplayArea.Visibility = Windows.Visibility.Visible
            explainDisplayArea.Visibility = Windows.Visibility.Collapsed

冒頭(以前の記事参照)で作成したクラスを利用して、検索結果を表示します。新しいリストを作成し、検索条件に該当する<献立>要素について処理を繰り返します。<主献立>、<菜食基本食材>、<菜食オプション>、<肉>、<魚介>、<乳>、<卵>の各要素の値を取得し、リストに追加します。これを、ListBox4のItemsSourceに適用します。

検索結果がない場合は、"該当する検索結果はありません。"というメッセージを表示します。また、「検索機能の使い方」を表示し、「検索結果」を非表示にします。

            Dim myitem4List As New List(Of item4List)

            For Each result In searchQuery

                Dim mainDish As String = result.<主献立>.Value
                Dim vegeIngredient As String = result.<菜食基本食材>.Value
                Dim vegeOption As String
                If result.<菜食オプション>.Value = "―" Then
                    vegeOption = String.Empty
                Else
                    vegeOption = "《" & result.<菜食オプション>.Value & "》"
                End If
                Dim meat As String = "肉:" & result.<肉>.Value & "|魚:" & result.<魚介>.Value & "|乳:" & result.<乳>.Value & "|卵:" & result.<卵
>.Value

                myitem4List.Add(New item4List With {.一品主献立 = mainDish, .一品菜食基本食材 = vegeIngredient, .一品菜食オプション = vegeOption, .一品肉食食材 = meat})

            Next
            ListBox4.ItemsSource = myitem4List
        Else
            MessageBox.Show("該当する検索結果はありません。")
            resultDisplayArea.Visibility = Windows.Visibility.Collapsed
            explainDisplayArea.Visibility = Windows.Visibility.Visible
        End If

    End Sub

Button2(「検索文字列クリア」ボタン)がクリックされた時の処理

Button1(「検索文字列クリア」ボタン)がクリックされた時、TextBoxに入力されている検索用キーワードをクリアします。これに伴い、変数keywordに代入されている値もクリアします。

    '検索用キーワードのクリア
    Private Sub Button2_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button2.Click
        TextBox1.Text = String.Empty
        keyword = TextBox1.Text
    End Sub

End Class

以上で、検索処理の完成です。
このサンプルの処理は、最低限のものですので、表示方法等を工夫すれば、もっと使い勝手は良くなると思います。

MainPage.xamlおよびMainPage.xaml.vbを、テキストファイルとしてアップロードしています。「ここをクリック」してダウンロードできます。何回かに分けて掲載したため、コピー&ペーストが面倒だと思われますので。

その場合、これまでの記事に書きました通り、ツールボックスへのPanoramaコントロールの追加とXAMLデザイン画面への配置、「プロジェクト/参照の追加」から「System.Xml.Linq」名前空間の追加、画像ファイルやXMLファイルの指定フォルダへの追加およびサーバへの配置、XAMLコード内の<ImageBrush>要素のImageSourceへの背景画像の指定、ロジックコード内のXMLファイルの置き場所のURIの変更(★の個所)、といった一連の作業が必要です。

この記事で取り上げている処理は、Panoramaコントロールを用いている点を除けば、ブラウザやデスクトップで表示させるSilverlightアプリケーションあるいは、従来のASP.NETアプリケーションとほとんど変わりません。従来作業の延長線上で何か一つサンプルプログラミングを行い、そのうえで、Mangoならではの機能を使ってみると、Phoneアプリ開発に取り組みやすくなるのではないでしょうか。

Fukushimaが進行形であることを頭の中に常に留めておくために
ニュースが減ると忘れていく人が増えるので、ときどき記事の最後に付けています。
筆者は、原発立地県居住者で、今は定検後の稼働から目が離せない状況であって、原発問題は常に頭の中にあるのですが。
被曝線量250ミリ超え、「ただちに影響なし」も将来的ながん発症リスク 作業員不足の懸念も(msn産経ニュース)

Comment(0)

コメント

コメントを投稿する