■智恵袋の表示フォーム作成 (blogDisplay.aspx)

 

智恵袋に入力したデータを表示するWebフォームを作成します。ここで作成するWebフォームでは、以下の機能をサポートします。

 

  智恵袋に登録されているデータを登録日の降順に表示する機能

  カレンダーから登録日を選択して知恵袋から該当するデータを表示する機能

  智恵袋に登録されているデータをキーワードで検索して表示する機能

  知恵袋からカテゴリー別のデータを表示する機能

 

新規フォームを作成したら、2x4の表を作成します。1行目のセル1には、見出し1「私の智恵袋」を配置します。1行目のセル3には、見出し2「今日の気づき」と4個のLabelコントロールを配置します。これらのLabelコントロールには、表示するデータの開始日、検索条件、カテゴリー名、固定リンクを表示します。セル2とセル4は、予備のために確保しておきます。

 

2行目のセル1にはCalendar、検索で使用するTextBox(検索条件入力)とButton(検索)、そしてカテゴリー別のリンクを表示するためにRepeaterを配置します。2行目のセル3には、智恵袋の「タイトル」、「内容」などを表示するためにDataListを配置します。また、DataListに表示されてデータをページングするために上下に2個のButton(次頁)を配置します。

 

13:デザイナに表を作成したらツールボックスから各種コントロールを配置する

 

Webページを表示すると「カレンダー」には、Webサーバーのシステム日付に該当する年月が既定値として表示されます。「検索」からは「キーワード」を入力して智恵袋のデータを検索することができます。「カテゴリー」には、智恵袋に登録されているカテゴリーの一覧が表示されます。カテゴリーのリンクをクリックすると、カテゴリーに該当するデータが登録日の降順に表示されます。Webページ中央のDataListには、智恵袋の「登録日」、「タイトル」、「カテゴリー名」、「内容」が表示されます。また、最下位には、「投稿時間」と「固定リンク」、「編集」のリンクが表示されます。「固定リンク」をクリックすると、当該データが1件表示されます。「編集」のリンクをクリックすると、該当データが編集モードで表示されます。データをページングするときは、[次頁]のボタンをクリックします。データは1ページに5件表示されます。

 

14:智恵袋に登録されているデータを登録日の降順に表示した例

 

●カレンダーから日付を選択して該当するデータを表示

 

Calendarから選択した日付のデータを表示するには、CalendarSelectionChangedイベントハンドラを追加します。このイベントハンドラでは、CalendarSelectedDateプロパティから選択した日付を取得してGetEntriesByDateメソッドの引数に渡します。

 

Private Sub calBlog_SelectionChanged(・・・) Handles calBlog.SelectionChanged

  Dim dtmStartDate As DateTime = Me.calBlog.SelectedDate

  GetEntriesByDate(dtmStartDate.AddDays(1), Integer.MaxValue)

End Sub

 

GetEntriesByDateメソッドは、SQLSELECTステートメントを実行して、tblBlogテーブルから選択した日付に該当するデータの上位(降順)5件を表示します。

 

リスト5:智恵袋データベースから登録日指定でデータを抽出するメソッド (blogDisplay.aspx.vb)

Sub GetEntriesByDate(ByVal dtmStartDate As DateTime, ByVal intBlogID As Integer)

  Dim strSQL As String = "SELECT TOP 5 * FROM tblBlog WHERE EntryDateTime <= @StartDate AND BlogID < @BlogID ORDER BY EntryDateTime Desc"

  Dim strConnectionString As String = ConfigurationSettings.AppSettings("conStringBlog")

  Dim con As New OleDbConnection(strConnectionString)

  Dim cmd As New OleDbCommand(strSQL, con)

  Dim da As New OleDbDataAdapter(cmd)

  Dim dt As New DataTable

  cmd.Parameters.Add("@StartDate", dtmStartDate)

  cmd.Parameters.Add("@BlogID", intBlogID)

  da.Fill(dt)

  dlstContent.DataSource = dt

  dlstContent.DataBind()

End Sub

 

WebページにCalendarを表示するとき、該当する日付にデータが登録されているとき日付を選択された状態で表示するには、GetCalendarDatesメソッドを実行します。このメソッドは、tblBlogテーブルから登録日を抽出してCalendarSelectedDatesコレクションのAddメソッドで日付を登録します。SelectedDatesコレクションに登録された日付は、背景色が灰色で表示されます。

 

当日以降の日付をCalendarから選択できないようにするには、DayRenderイベントハンドラに以下のようなコードを追加します。

 

Private Sub calBlog_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles calBlog.DayRender

  If e.Day.Date > DateTime.Today Then

    e.Day.IsSelectable = False

  End If

End Sub

 

 

15:データが登録されている日付の背景色が灰色で表示される

 

リスト6:データが登録されている日付の背景色を灰色に設定するメソッド  (blogDisplay.aspx.vb)

Sub GetCalendarDates()

  Dim dtmStartDate As DateTime = Me.calBlog.VisibleDate.AddMonths(-1)

  Dim strSQL As String = "SELECT EntryDateTime FROM tblBlog WHERE EntryDateTime >= @StartDate"

  Dim strConnectionString As String = ConfigurationSettings.AppSettings("conStringBlog")

  Dim con As New OleDbConnection(strConnectionString)

  Dim cmd As New OleDbCommand(strSQL, con)

  Dim da As New OleDbDataAdapter(cmd)

  Dim dt As New DataTable

  cmd.Parameters.Add("@StartDate", dtmStartDate)

  da.Fill(dt)

  calBlog.SelectedDates.Clear()

  For Each dr As DataRow In dt.Rows

    calBlog.SelectedDates.Add(dr("EntryDateTime"))

  Next

End Sub

 

●キーワードに該当するデータを表示

 

TextBoxに入力した「キーワード」に該当するデータを表示するには、[検索]ボタンにクリック時のイベントハンドラを追加します。このイベントハンドラでは、TextBoxから「キーワード」を取得したら、GetEntriesBySearchTermメソッドの引数に渡します。TextBoxから「キーワード」を取得するとき、SQLHTMLタグが挿入されないようにHTMLエンコードします。

 

Private Sub btnSearch_Click(・・・) Handles btnSearch.Click

  Dim strSearchTerm As String = Server.HtmlEncode(Me.txtSearch.Text)

  GetEntriesBySearchTerm(strSearchTerm)

End Sub

 

GetEntriesBySearchTermメソッドは、SQLSELECTステートメントを実行してtblBlogテーブルから「キーワード」に該当するデータを抽出して表示します。このとき、SELECTステートメントのWHERE句にワイルドカード(%)指定して曖昧検索します。たとえば、キーワードに「blog」を入力したときは、以下のようなSQLが実行されます。

 

SELECT * FROM tblBlog

WHERE Title Like "%blog%" OR Description Like "%blog%"

ORDER BY BlogID DESC

 

リスト7:智恵袋データベースからキーワードでデータを抽出するメソッド (blogDisplay.aspx.vb)

Sub GetEntriesBySearchTerm(ByVal strSearchTerm As String)

  Dim strSQL As String = "SELECT * FROM tblBlog " & _

    "WHERE Title Like @Title OR Description Like @Description " & _

    "ORDER BY BlogID DESC"

  Dim strConnectionString As String = ConfigurationSettings.AppSettings("conStringBlog")

  Dim con As New OleDbConnection(strConnectionString)

  Dim cmd As New OleDbCommand(strSQL, con)

  Dim strWildCard As String = String.Format("%{0}%", strSearchTerm)

  cmd.Parameters.Add("@Title", strWildCard)

  cmd.Parameters.Add("@Desctiption", strWildCard)

  con.Open()

  dlstContent.DataSource = cmd.ExecuteReader

  dlstContent.DataBind()

  con.Close()

End Sub

 

 

●カテゴリー別のデータを表示

 

Repeaterからカテゴリー別のリンクをクリックすると、「blogDisplay.aspx?categoryid=999」がロードされてPage_Loadイベントハンドラが実行されます。このイベントハンドラでは、IsPostBackプロパティを参照してWebページが最初にロードされたかどうかを診断します。最初にロードされたときは、RequestオブジェクトのQueryStringコレクションからクエリ文字列変数(categoryid)を取得して、GetEntriesByCategoryメソッドの引数に渡します。

 

Private Sub Page_Load(・・・) Handles MyBase.Load

  If Not IsPostBack Then

   If Not (Request.QueryString("permalink") Is Nothing) Then

      Dim intBlogID As Integer = Int32.Parse(Request.QueryString("permalink"))

      GetEntriesByPermalink(intBlogID)

    ElseIf Not (Request.QueryString("categoryid") Is Nothing) Then

      Dim intCategoryID As Integer = Int32.Parse(Request.QueryString("categoryid"))

      GetEntriesByCategory(intCategoryID)

    Else

      GetEntriesByDate(DateTime.Today.AddDays(1), Integer.MaxValue)

    End If

  End If

End Sub

 

GetEntriesByCategoryメソッドは、SQLSELECTステートメントを実行してtblBlogテーブルからカテゴリーIDに該当するデータを抽出して表示します。なお、tblBlogテーブルからCategoryIDフィールドでレコードを絞り込むには、tblBlogテーブルとtblBlogCatLinksテーブルをBlogIDで結合して、WHERE句にはtblBlogCatLinksテーブルのCategoryIDフィールドを指定します。

 

SELECT b.*

FROM tblBlog As b INNER JOIN tblBlogCatLinks As l ON b.BlogID = l.BlogID

WHERE l.CategoryID = @CategoryID

ORDER BY b.BlogID DESC

 

 

リスト8:智恵袋データベースからカテゴリー別のデータを抽出するメソッド  (blogDisplay.aspx.vb)

Sub GetEntriesByCategory(ByVal intCategoryID As Integer)

  Dim strSQL As String = "SELECT b.* " & _

    "FROM tblBlog As b INNER JOIN tblBlogCatLinks As l ON b.BlogID = l.BlogID " & _

    "WHERE l.CategoryID = @CategoryID " & _

    "ORDER BY b.BlogID DESC"

  Dim strConnectionString As String = ConfigurationSettings.AppSettings("conStringBlog")

  Dim con As New OleDbConnection(strConnectionString)

  Dim cmd As New OleDbCommand(strSQL, con)

  cmd.Parameters.Add("@CategoryID", intCategoryID)

  con.Open()

  dlstContent.DataSource = cmd.ExecuteReader

  dlstContent.DataBind()

  con.Close()

End Sub