解説

実例で学ぶASP.NETプログラミング

第11回 ASP.NETで進化する「検索画面」の構築

小田原 貴樹(うりゅう)
2004/03/20

 これで「お酒の種類」RadioButtonListコントロールに表示されている各項目のうち、指定されたフィルタ条件に一致しない項目を削除するための関数は完成した。この関数を実行すると、選択された項目と組み合わせた際に一致しない項目は削除されるころになる。ほかの4つの関数(NOMICHメソッド/AMACHメソッド/KAKAKUCHメソッド/SIZECHメソッド)も内容はほとんど同じなので、以下を参照してほしい。

 1: Public Sub NOMICH(ByVal PVIEW As DataView, ByVal RL As RadioButtonList, ByVal BFIL As String)
 2:   Dim I As Integer
 3:   Dim DELI() As Integer
 4:   Dim X As Integer = 0
 5:   For I = 0 To RL.Items.Count - 1
 6:     PVIEW.RowFilter = BFIL & " AND " & RL.Items(I).Value & " = TRUE"
 7:     If PVIEW.Count = 0 Then
 8:       ReDim Preserve DELI(X)
 9:       DELI(X) = I
10:       X += 1
11:     End If
12:     PVIEW.RowFilter = BFIL
13:   Next
14:   If Not DELI Is Nothing Then
15:     Dim L As Integer = 0
16:     For I = 0 To DELI.GetUpperBound(0)
17:       RL.Items.RemoveAt(DELI(I) - L)
18:       L += 1
19:     Next
20:   End If
21: End Sub
「飲み方」RadioButtonListコントロールでフィルタ条件に一致しない項目を削除する関数(NOMICHメソッド)

 「飲み方」のRadioButtonListコントロールに表示されている各項目のうち、指定されたフィルタ条件に一致しない項目を削除するための関数。

 1: Public Sub AMACH(ByVal PVIEW As DataView, ByVal RL As RadioButtonList, ByVal BFIL As String)
 2:   Dim I As Integer
 3:   Dim DELI() As Integer
 4:   Dim X As Integer = 0
 5:   For I = 0 To RL.Items.Count - 1
 6:     PVIEW.RowFilter = BFIL & " AND 甘辛 = " & RL.Items(I).Value
 7:     If PVIEW.Count = 0 Then
 8:       ReDim Preserve DELI(X)
 9:       DELI(X) = I
10:       X += 1
11:     End If
12:     PVIEW.RowFilter = BFIL
13:   Next
14:   If Not DELI Is Nothing Then
15:     Dim L As Integer = 0
16:     For I = 0 To DELI.GetUpperBound(0)
17:       RL.Items.RemoveAt(DELI(I) - L)
18:       L += 1
19:     Next
20:   End If
21: End Sub
「甘辛」RadioButtonListコントロールでフィルタ条件に一致しない項目を削除する関数(AMACHメソッド)

 「甘辛」のRadioButtonListコントロールに表示されている各項目のうち、指定されたフィルタ条件に一致しない項目を削除するための関数。

 1: Public Sub KAKAKUCH(ByVal PVIEW As DataView, ByVal RL As RadioButtonList, ByVal BFIL As String)
 2:   Dim I As Integer
 3:   Dim DELI() As Integer
 4:   Dim X As Integer = 0
 5:   For I = 0 To RL.Items.Count - 1
 6:     PVIEW.RowFilter = BFIL & " AND " & RL.Items(I).Value
 7:     If PVIEW.Count = 0 Then
 8:       ReDim Preserve DELI(X)
 9:       DELI(X) = I
10:       X += 1
11:     End If
12:     PVIEW.RowFilter = BFIL
13:   Next
14:   If Not DELI Is Nothing Then
15:     Dim L As Integer = 0
16:     For I = 0 To DELI.GetUpperBound(0)
17:       RL.Items.RemoveAt(DELI(I) - L)
18:       L += 1
19:     Next
20:   End If
21: End Sub
「価格帯」RadioButtonListコントロールでフィルタ条件に一致しない項目を削除する関数(KAKAKUCHメソッド)

 「価格帯」のRadioButtonListコントロールに表示されている各項目のうち、指定されたフィルタ条件に一致しない項目を削除するための関数。

 1: Public Sub SIZECH(ByVal PVIEW As DataView, ByVal RL As RadioButtonList, ByVal BFIL As String)
 2:   Dim I As Integer
 3:   Dim DELI() As Integer
 4:   Dim X As Integer = 0
 5:   For I = 0 To RL.Items.Count - 1
 6:     PVIEW.RowFilter = BFIL & " AND " & RL.Items(I).Value
 7:     If PVIEW.Count = 0 Then
 8:       ReDim Preserve DELI(X)
 9:       DELI(X) = I
10:       X += 1
11:     End If
12:     PVIEW.RowFilter = BFIL
13:   Next
14:   If Not DELI Is Nothing Then
15:     Dim L As Integer = 0
16:     For I = 0 To DELI.GetUpperBound(0)
17:       RL.Items.RemoveAt(DELI(I) - L)
18:       L += 1
19:     Next
20:   End If
21: End Sub
「容量」RadioButtonListコントロールでフィルタ条件に一致しない項目を削除する関数(SIZECHメソッド)

 「容量」のRadioButtonListコントロールに表示されている各項目のうち、指定されたフィルタ条件に一致しない項目を削除するための関数。

 さて、これで各項目を選択した際に実行されなければならない処理はすべて実装した。後は各RadioButtonListコントロールのSelectedIndexChangedイベントのハンドラ・メソッドを実装していくだけだ。ほかの4つのハンドラ・メソッドも以下に示すようにほとんど同じ内容である。

 1: Private Sub NOMI_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NOMI.SelectedIndexChanged
 2:   Dim OVALUE As Object = NOMI.SelectedItem.Value
 3:   Dim OTEXT As Object = NOMI.SelectedItem.Text
 4:   OWNCLR(NOMI, OVALUE, OTEXT)
 5:   Session("SX(2)") = 1
 6:   Session("PVIEW").RowFilter = Session("BFIL") & OVALUE & " = TRUE"
 7:   NCNT.Text = Session("PVIEW").Count
 8:   Session("BFIL") = Session("PVIEW").RowFilter
 9:   If Session("SX(1)") = 0 Then SAKECH(Session("PVIEW"), SAKE, Session("BFIL"))
10:   If Session("SX(3)") = 0 Then AMACH(Session("PVIEW"), AMA, Session("BFIL"))
11:   If Session("SX(4)") = 0 Then KAKAKUCH(Session("PVIEW"), KAKAKU, Session("BFIL"))
12:   If Session("SX(5)") = 0 Then SIZECH(Session("PVIEW"), SIZE, Session("BFIL"))
13:
14:   Session("BFIL") = Session("BFIL") & " AND "
15: End Sub
「飲み方」RadioButtonListコントロールの項目が選択された場合のイベント処理コード
 
 1: Private Sub AMA_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AMA.SelectedIndexChanged
 2:   Dim OVALUE As Object = AMA.SelectedItem.Value
 3:   Dim OTEXT As Object = AMA.SelectedItem.Text
 4:   OWNCLR(AMA, OVALUE, OTEXT)
 5:   Session("SX(3)") = 1
 6:   Session("PVIEW").RowFilter = Session("BFIL") & "甘辛 = " & OVALUE
 7:   NCNT.Text = Session("PVIEW").Count
 8:   Session("BFIL") = Session("PVIEW").RowFilter
 9:   If Session("SX(1)") = 0 Then SAKECH(Session("PVIEW"), SAKE, Session("BFIL"))
10:   If Session("SX(2)") = 0 Then NOMICH(Session("PVIEW"), NOMI, Session("BFIL"))
11:   If Session("SX(4)") = 0 Then KAKAKUCH(Session("PVIEW"), KAKAKU, Session("BFIL"))
12:   If Session("SX(5)") = 0 Then SIZECH(Session("PVIEW"), SIZE, Session("BFIL"))
13:
14:   Session("BFIL") = Session("BFIL") & " AND "
15: End Sub
「甘辛」RadioButtonListコントロールの項目が選択された場合のイベント処理コード
 
 1: Private Sub KAKAKU_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KAKAKU.SelectedIndexChanged
 2:   Dim OVALUE As Object = KAKAKU.SelectedItem.Value
 3:   Dim OTEXT As Object = KAKAKU.SelectedItem.Text
 4:   OWNCLR(KAKAKU, OVALUE, OTEXT)
 5:   Session("SX(4)") = 1
 6:   Session("PVIEW").RowFilter = Session("BFIL") & OVALUE
 7:   NCNT.Text = Session("PVIEW").Count
 8:   Session("BFIL") = Session("PVIEW").RowFilter
 9:   If Session("SX(1)") = 0 Then SAKECH(Session("PVIEW"), SAKE, Session("BFIL"))
10:   If Session("SX(2)") = 0 Then NOMICH(Session("PVIEW"), NOMI, Session("BFIL"))
11:   If Session("SX(3)") = 0 Then AMACH(Session("PVIEW"), AMA, Session("BFIL"))
12:   If Session("SX(5)") = 0 Then SIZECH(Session("PVIEW"), SIZE, Session("BFIL"))
13:
14:   Session("BFIL") = Session("BFIL") & " AND "
15: End Sub
「価格帯」RadioButtonListコントロールの項目が選択された場合のイベント処理コード
 
 1: Private Sub SIZE_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SIZE.SelectedIndexChanged
 2:   Dim OVALUE As Object = SIZE.SelectedItem.Value
 3:   Dim OTEXT As Object = SIZE.SelectedItem.Text
 4:   OWNCLR(SIZE, OVALUE, OTEXT)
 5:   Session("SX(5)") = 1
 6:
 7:   Session("PVIEW").RowFilter = Session("BFIL") & OVALUE
 8:   NCNT.Text = Session("PVIEW").Count
 9:   Session("BFIL") = Session("PVIEW").RowFilter
10:   If Session("SX(1)") = 0 Then SAKECH(Session("PVIEW"), SAKE, Session("BFIL"))
11:   If Session("SX(2)") = 0 Then NOMICH(Session("PVIEW"), NOMI, Session("BFIL"))
12:   If Session("SX(3)") = 0 Then AMACH(Session("PVIEW"), AMA, Session("BFIL"))
13:   If Session("SX(4)") = 0 Then KAKAKUCH(Session("PVIEW"), KAKAKU, Session("BFIL"))
14:
15:   Session("BFIL") = Session("BFIL") & " AND "
16: End Sub
「容量」RadioButtonListコントロールの項目が選択された場合のイベント処理コード

 似たようなコードが並んでいるが、異なるのはほかの4つのRadioButtonListコントロールの指定の部分と、RowFilterプロパティに対する記述の仕方だ。検索画面上では各RadioButtonListコントロールは同様に表現されているが、商品情報データ内での格納され方は異なるため、WHERE条件文の記述の仕方で吸収している。コードを参照する際には、特にRowFilterプロパティの指定部分を注意して確認してほしい。ここまでの作業で一連の検索の流れは完成した。続いては「選択の解除」ボタンが押された際の処理を作成しよう。

ユーザーが選択を解除した際のイベント処理を実装する

 今回作成している検索画面では、項目を選択していくごとに各RadioButtonListコントロールが無効化されていくので、ユーザーが検索をやり直したくなった場合のために、選択の解除ボタンが必要になる。この解除ボタンが押された際のイベント処理を実装しよう。以下のコードを参照してほしい。

 1: Private Sub CLB_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles CLB.Click
 2:   Dim PSET As New PVSET
 3:   Dim PVIEW As New DataView
 4:   DC.FDPV(PSET)
 5:   PVIEW.Table = PSET.Tables("酒完成表")
 6:   Session("PVIEW") = PVIEW
 7:   ACNT.Text = Session("PVIEW").Count
 8:   NCNT.Text = Session("PVIEW").Count
 9:   SAKEIN(SAKE)
10:   NOMIIN(NOMI)
11:   AMAIN(AMA)
12:   KAKAKUIN(KAKAKU)
13:   SIZEIN(SIZE)
14:
15:   Session("BFIL") = ""
16:   Dim I As Integer
17:   For I = 1 To 5
18:     Session("SX(" & I & ")") = 0
19:   Next
20: End Sub
解除ボタンがクリックされたときにページを初期状態に戻すコード

 上のコードは一目瞭然だ。Page_Loadイベントで実装したコードとほとんど変わらない。解除ボタンが押された際にはページが開かれた状態に戻しているだけだ。これで、ボタンを押せば繰り返し検索が行えるようになった。


 INDEX
  実例で学ぶASP.NETプログラミング
  第11回 ASP.NETで進化する「検索画面」の構築
    1.Web系システムにおける「検索画面」の必要性と問題点
    2.検索画面のデザインを作成する
    3.RadioButtonListコントロールを初期化するための関数を作成する
    4.ユーザーが項目を選択した際のイベント処理を実装する
  5.ユーザーが選択を解除した際のイベント処理を実装する
    6.検索結果画面の作成と実行結果の確認
 
インデックス・ページヘ  「解説 :実例で学ぶASP.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間