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産経ニュース)