2

Repeater Control メソッドを使用してページに xml の詳細を表示するページ (category-list.apsx) があります。ここに示す例を使用しました。

http://www.w3schools.com/aspnet/aspnet_repeater.asp

これは問題なく動作しますが、ユーザーが CategoryName のドロップダウンを使用して結果をフィルター処理できるようにしたいと考えています。

結果リピーターは次のようになります。

<form runat="server">
<asp:Repeater id="categories" runat="server">

    <ItemTemplate>
      <tr>
        <td><%#Container.DataItem("CategoryName")%> </td>
        <td>&nbsp;</td>
        <td><%#Container.DataItem("CategoryMonth")%> </td>
        <td>&nbsp;</td>
        <td><%#Container.DataItem("CategoryMonthSpend")%> </td>
        <td>&nbsp;</td>
        <td><%#Container.DataItem("Amount")%> </td>
      </tr>
    </ItemTemplate>

</asp:Repeater>
</form>

XML は次のようになります。

<catalog>
    <categories>
    <CategoryName>Category Name1</CategoryName>
    <CategoryMonth>April 2012</CategoryMonth>
    <CategoryMonthSpend>£1</CategoryMonthSpend> <Amount>1</Amount>                              
    </categories>
</catalog>

リピーターをアクティブにするスクリプトを以下に示します。

<script  runat="server">
Public Sub Page_Load()
    If Not Page.IsPostBack Then
        Dim cat As String = Request.QueryString("cat")
        Dim mycategories As DataSet = New DataSet()
        mycategories.ReadXml(MapPath("XML/" + cat + ".xml"))
        categories.DataSource = mycategories
        categories.DataBind()
    End If
End Sub

</script>
4

1 に答える 1

4

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>&nbsp;</td>
            <td><%#Container.DataItem("CategoryMonth")%> </td>
            <td>&nbsp;</td>
            <td><%#Container.DataItem("CategoryMonthSpend")%> </td>
            <td>&nbsp;</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つの別々のコントロールがDataSetXMLファイルで同じものをより簡単に共有できるようにしました。を使用すると、標準のクエリやオブジェクトIEnumerableよりもはるかに優れていると感じるLINQを使用できます。DataTableDataView

DropDownListデータバインディングコードでは、データの1つの列を選択し、それを文字列のコレクションに変換しています。またDistinct、重複を排除するための適切な対策を求めています。また、リストに空白の項目を自由に追加できるので、ユーザーはフィルターなしを選択してすべてを表示することができます。

SelectedIndexChangedDropDownList値が空白かどうかを確認するために、イベントハンドラーに少しコードがあることに気付くでしょう。これは必ずしも最も堅牢であるとは限りません(アイテムの1つに実際に空白の「CategoryName」があり、それをフィルタリングしたい場合は故障します)が、この例では機能します。ddlCategory.SelectedIndex <> 0別の方法は、フィルターが選択されているかどうかのチェックとして使用することです。

これは、ここで行われているすべてのことを完全に説明しているわけではないので、遠慮なく質問してください。ただし、これは、将来の開発のために拡張できる実用的な例に到達するのに役立つはずです。

編集:System.Collections.Genericこのコードでは、名前空間と名前空間を インポートしておく必要がありSystem.Linqます。Visual Studio 2010では、これはWebアプリケーションプロジェクトにすでに自動的にインポートされている可能性があります。そうでない場合は、コードファイルに直接追加するか、Webアプリケーションの[プロジェクトのプロパティ]ページの[参照]>[インポートされた名前空間]で追加することができます。

于 2012-08-30T15:19:05.743 に答える