OK、ここでかなりカバーするので、各セクションの圧倒的な詳細には立ち入りません。うまくいけば、これはASP.NETのデータバインディングをもう少し理解するための良い出発点になるはずです。
<script runat="server">
私は実際にコードを.aspxページの内部ではなく、コードビハインドで記述することを好みます。そのため、この例ではコードがここにあります。ただし、機能的にはここでの違いはなく、必要に応じて、このコードをその.aspx側スクリプトに配置することを選択できます。
まずRepeater
、テンプレートを修正しましょう。テーブルレイアウトを使用しているように見えますが、テンプレートのどこにも実際の<table></table>
タグはありません。とを追加する必要があり<HeaderTemplate>
ます<FooterTemplate>
<asp:Repeater id="categories" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%#Container.DataItem("CategoryName")%> </td>
<td> </td>
<td><%#Container.DataItem("CategoryMonth")%> </td>
<td> </td>
<td><%#Container.DataItem("CategoryMonthSpend")%> </td>
<td> </td>
<td><%#Container.DataItem("Amount")%> </td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
次にDropDownList
、フィルタリングに使用するaspxページでを宣言しましょう。
<asp:DropDownList ID="ddlCategory" runat="server" AutoPostBack="true" />
ここでのAutoPostBack
プロパティはDropDownList
、サーバーに自動的にSelectedIndexChanged
ポストバックし、コードで処理できるサーバー上のイベントを発生させることを意味します。Button
または、フィルターをトリガーするときにaを使用してクリックすることもできます。
第3に、データバインディングコードを、より簡単に再利用できる、すっきりとした小さなメソッドに分けましょう。
Private Function GetXmlDataSet() As IEnumerable(Of DataRow)
Dim cat As String = Request.QueryString("cat")
Dim mycategories As DataSet = New DataSet()
mycategories.ReadXml(MapPath("XML/" + cat + ".xml"))
' I like to use IEnumerable because so that I can use LINQ '
Return mycategories.Tables(0).AsEnumerable()
End Function
Private Sub BindRepeater(query As IEnumerable(Of DataRow))
categories.DataSource = query
categories.DataBind()
End Sub
Private Sub BindDropDownList(query As IEnumerable(Of DataRow))
ddlCategory.DataSource = query.Select(Function(x) x("CategoryName")).Distinct()
ddlCategory.DataBind()
' Insert an empty choice into the DropDownList '
ddlCategory.Items.Insert(0, "")
End Sub
第4Page_Load
に、これらのメソッドを利用できるようにコードを更新しましょう。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If (Not IsPostBack) Then
Dim query = GetXmlDataSet()
BindDropDownList(query)
BindRepeater(query)
End If
End Sub
最後SelectedIndexChanged
に、そして確かに重要なことですが、このデータセットのフィルタリングをトリガーするためにイベントハンドラーを作成しましょう。
Private Sub ddlCategory_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ddlCategory.SelectedIndexChanged
Dim selectedCategory As String = ddlCategory.SelectedValue.ToString()
Dim query = GetXmlDataSet()
If (Not String.IsNullOrEmpty(selectedCategory)) Then
query = GetXmlDataSet().Where(Function(x) x("CategoryName") = selectedCategory)
End If
BindRepeater(query)
End Sub
では、ここで何をしましたか?これらのデータバインディングメソッドを分離することで、少しすっきりさせ、2つの別々のコントロールがDataSet
XMLファイルで同じものをより簡単に共有できるようにしました。を使用すると、標準のクエリやオブジェクトIEnumerable
よりもはるかに優れていると感じるLINQを使用できます。DataTable
DataView
DropDownList
データバインディングコードでは、データの1つの列を選択し、それを文字列のコレクションに変換しています。またDistinct
、重複を排除するための適切な対策を求めています。また、リストに空白の項目を自由に追加できるので、ユーザーはフィルターなしを選択してすべてを表示することができます。
SelectedIndexChanged
DropDownList値が空白かどうかを確認するために、イベントハンドラーに少しコードがあることに気付くでしょう。これは必ずしも最も堅牢であるとは限りません(アイテムの1つに実際に空白の「CategoryName」があり、それをフィルタリングしたい場合は故障します)が、この例では機能します。ddlCategory.SelectedIndex <> 0
別の方法は、フィルターが選択されているかどうかのチェックとして使用することです。
これは、ここで行われているすべてのことを完全に説明しているわけではないので、遠慮なく質問してください。ただし、これは、将来の開発のために拡張できる実用的な例に到達するのに役立つはずです。
編集:System.Collections.Generic
このコードでは、名前空間と名前空間を インポートしておく必要がありSystem.Linq
ます。Visual Studio 2010では、これはWebアプリケーションプロジェクトにすでに自動的にインポートされている可能性があります。そうでない場合は、コードファイルに直接追加するか、Webアプリケーションの[プロジェクトのプロパティ]ページの[参照]>[インポートされた名前空間]で追加することができます。