OK ,在這裏可以覆蓋很多,所以我不會對每個部分進行詳細的介紹。希望這會給你一個很好的起點,讓你更好地理解ASP.NET中的Databinding。
我更喜歡在代碼隱藏中編寫我的代碼,而不是在我的.aspx頁面中輸入<script runat="server">
,這就是我的代碼在這個例子中的位置。但功能上,這裏沒有區別,如果您願意,您可以選擇將該代碼放入.aspx側腳本中。
第一個,讓我們來修復您的Repeater
模板。您似乎正在使用表格佈局,但您的模板中沒有任何地方是實際的<table></table>
標記。您需要添加一個和<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
,以便重複刪除。我還可以隨意在列表中添加一個空白項目,以便用戶可以選擇NO篩選並顯示所有內容。
您會注意到SelectedIndexChanged
事件處理程序中有一小段代碼來查看DropDownList值是否爲空。這不一定是最強大的(如果其中一個項目實際上有一個空白的「CategoryName」,並且您想對其過濾),但會適用於此示例。另一種方法是使用ddlCategory.SelectedIndex <> 0
來檢查是否選擇了過濾器。
這絕不是對這裏發生的一切事情的完整解釋,所以請隨時提問。然而,這應該有助於讓你成爲一個可以在未來發展中擴展的實例。
編輯:此代碼要求您已導入System.Collections.Generic
命名空間和System.Linq
命名空間。在Visual Studio 2010中,這可能已經自動導入到Web應用程序項目中。如果沒有,你可以選擇直接在你的代碼文件或在項目屬性頁面添加它們爲Web應用程序下參考>導入的命名空間
你需要一個'DropDownList'控制開始。你有什麼嘗試?問題是什麼? –
[documentation here](http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.selectedindexchanged.aspx)中的示例可能對您有所幫助。更改'Index_Changed'中的代碼以適當地過濾列表。 –
@Jason您能否將您用來綁定您的'Repeater'的代碼貼出來?另外,請包含您爲'DropDownList'控件定義的標記。 – mclark1129