我有一个页面(category-list.apsx),它使用Repeater Control方法在页面上显示xml详细信息。我使用了这里显示的例子:
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> </td>
<td><%#Container.DataItem("CategoryMonth")%> </td>
<td> </td>
<td><%#Container.DataItem("CategoryMonthSpend")%> </td>
<td> </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>
答案 0 :(得分:4)
好的,这里有很多内容,所以我不会详细介绍每个部分。希望这能为您提供一个很好的起点,让您更好地理解ASP.NET中的数据绑定。
我更喜欢在代码隐藏中编写我的代码,而不是在我的.aspx页面中编写<script runat="server">
,所以这就是我的代码在这个例子中的位置。但是,在功能上,这里没有区别,如果您愿意,可以选择将此代码放在.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>
第二次,让我们在您希望用于过滤的aspx页面上声明DropDownList
:
<asp:DropDownList ID="ddlCategory" runat="server" AutoPostBack="true" />
此处的AutoPostBack
属性表示您的DropDownList
会自动回发到服务器,并在服务器上启动您可以在代码中处理的SelectedIndexChanged
事件。或者,您可以在要触发过滤器时使用Button
进行单击。
第三次,让我们将您的数据绑定代码分成漂亮,简洁的小方法,这些方法可以更容易地重复使用。
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
第四次,让我们更新您的Page_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
那我们在这做什么?通过分离出这些数据绑定方法,我使其更加清晰,并允许两个单独的控件更轻松地在XML文件中共享相同的DataSet
。使用IEnumerable
允许我使用LINQ,我觉得它比DataTable
或DataView
对象的标准查询要好得多。
在DropDownList
数据绑定代码中,我选择了一列数据并将其转换为字符串集合。我还要调用Distinct
以获得良好的衡量标准,以便删除重复项。我也冒昧地在列表中添加一个空白项,以便用户可以选择“无过滤器”,并显示所有内容。
您会注意到SelectedIndexChanged
事件处理程序中有一些代码可以查看DropDownList值是否为空。这不一定是最强大的(如果您的某个项目实际上有一个空白的“CategoryName”并且您想要对其进行过滤,则会中断),但适用于此示例。另一种方法是使用ddlCategory.SelectedIndex <> 0
检查是否选择了过滤器。
这绝不是对这里所发生的一切的完整解释,所以请随意提问。但是,这应该有助于您找到一个可以扩展以便将来开发的工作示例。
编辑:此代码要求您已导入System.Collections.Generic
命名空间和System.Linq
命名空间。在Visual Studio 2010中,这可能已在Web应用程序项目中自动导入。如果没有,您可以选择直接在代码文件中或在参考&gt;下的Web应用程序的项目属性页面中添加它们。导入的命名空间