2014-04-30 73 views
0

我有一個連接到訪問數據庫的中繼器。中繼器使用%#Eval(「text」)%>命令和AccessDataSource抽取信息。帶下拉式過濾器的中繼器(Asp.net/C#)

我能夠顯示inital數據正常,但我希望能夠使用一系列下拉列表過濾記錄。例如,只能通過「製作」「年」「彩色」列出汽車。我已經能夠過濾數據如何我想要的,但這是通過顯示它在第二個中繼器和使用另一個AccessDataSource。理想情況下,我想只使用一個相應更新的中繼器。

有什麼建議嗎?謝謝。

<asp:AccessDataSource ID="AccessDataSource1" runat="server" 
DataFile="~/App_Data/Cars.accdb" 
SelectCommand="SELECT * FROM [Cars]"> 
</asp:AccessDataSource> 


<asp:AccessDataSource ID="AccessDataSource2" runat="server" 
    DataFile="~/App_Data/Cars.accdb" 
     SelectCommand="SELECT Make, [Year], Model, Colour, Artwork, Type, WHERE (Colour = ?)"> 
<SelectParameters> 
    <asp:ControlParameter ControlID="ColourDropdown" Name="Colour" PropertyName="SelectedValue" Type="String" /> 
</SelectParameters> 
</asp:AccessDataSource> 




<asp:DropDownList ID="GenreDropdown" runat="server" 
    DataSourceID="AccessDataSource1" DataTextField="Colour" DataValueField="Colour" 
    AppendDataBoundItems="True" CssClass="form-control" DataMember="DefaultView"  AutoPostBack="True" > 
<asp:ListItem Value="%"</asp:ListItem> 
</asp:DropDownList> 




<asp:Repeater ID="Repeater2" runat="server" DataSourceID="AccessDataSource1"> 
<ItemTemplate> 
     <div class="row list-group-item active"> 
      <div class="col-xs-2">   
      <p class="list-group-item-text active"><img src="carimages/<%#Eval("Artwork")%>" /></div> 
      <div class="col-xs-4">  
      <h4 class="list-group-item-heading"><%# Eval("Make")%> (<%# Eval("Year") %>)</h4> 
      <p class="list-group-item-text"><%# Eval("Model")%></p> 
      <p class="list-group-item-text"><%# Eval("Colour")%></p> 
      <p class="list-group-item-text"><%# Eval("Type")%></p></div> 
      <div class="col-xs-4"> 
      </div> 
      </a> 
      </div> 
</ItemTemplate> 
</asp:Repeater> 



<asp:Repeater ID="Repeater3" runat="server" DataSourceID="AccessDataSource2"> 
<ItemTemplate> 
     <div class="row list-group-item active"> 
      <div class="col-xs-2">   
      <p class="list-group-item-text active"><img src="carimages/<%#Eval("Artwork")%>" /></div> 
      <div class="col-xs-4">  
      <h4 class="list-group-item-heading"><%# Eval("Make")%> (<%# Eval("Year") %>)</h4> 
      <p class="list-group-item-text"><%# Eval("Model")%></p> 
      <p class="list-group-item-text"><%# Eval("Colour")%></p> 
      <p class="list-group-item-text"><%# Eval("Type")%></p></div> 
      <div class="col-xs-4"> 
      </div> 
      </a> 
      </div> 
</ItemTemplate> 
</asp:Repeater> 

回答

0

爲此,您需要將參數添加到數據源動態地(也就是在後面的代碼),而不是裝飾性。因此,在標記,你應該離開這個(猜這是你原來的佈局):

<asp:AccessDataSource ID="AccessDataSource1" runat="server" 
    DataFile="~/App_Data/Cars.accdb" 
    SelectCommand="SELECT * FROM [Cars]"> 
</asp:AccessDataSource> 

<asp:DropDownList ID="GenreDropdown" runat="server" 
    DataSourceID="AccessDataSource1" DataTextField="Colour" DataValueField="Colour" 
    AppendDataBoundItems="True" CssClass="form-control" DataMember="DefaultView"  AutoPostBack="True" > 
    <asp:ListItem Value="%"></asp:ListItem> 
</asp:DropDownList> 

<asp:Repeater ID="Repeater2" runat="server" DataSourceID="AccessDataSource1"> 
<ItemTemplate> 
     <div class="row list-group-item active"> 
      <div class="col-xs-2">   
      <p class="list-group-item-text active"><img src="carimages/<%#Eval("Artwork")%>" /></div> 
      <div class="col-xs-4">  
      <h4 class="list-group-item-heading"><%# Eval("Make")%> (<%# Eval("Year") %>)</h4> 
      <p class="list-group-item-text"><%# Eval("Model")%></p> 
      <p class="list-group-item-text"><%# Eval("Colour")%></p> 
      <p class="list-group-item-text"><%# Eval("Type")%></p></div> 
      <div class="col-xs-4"> 
      </div> 
      </a> 
      </div> 
</ItemTemplate> 
</asp:Repeater> 

而且在後面的代碼,說在頁面加載,這樣做:

AccessDataSource1.SelectParameters.Add("Colour", GenreDropdown.SelectedValue); 
Repeater2.DataBind(); 
+0

我試過上面,但它不接受。參數。在page_load事件上面的代碼中。 – user2904529

+0

@ user2904529,對不起,它應該是'SelectParameters'。更正了 – Andrei

+0

我已經更新了代碼,但沒有運氣。中繼器不會更新爲下拉列表選擇。我可能做錯了什麼,但是我的佈局/代碼與上面添加的page_load代碼相同。 – user2904529

0

您可以結合而下拉菜單,其中檢索SelectedIndexChanged事件數據和這個東西re.bind您的DataRepeater邏輯依賴從您的最終目標

UPDATE 這是一個函數的調用A示例使其適應你的邏輯

Private Sub ddlsomethinhg_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlsomethinhg.SelectedIndexChanged 
    //ASSUME INDEX 0 IS NOT VALID VALUE 
    If ddlsomethinhg.SelectedIndex = 0 Then 
     Exit Sub 
    Else 
     //ASSUME THAT IS INTEGER 
     Dim SEARCHVALUE As Integer = CInt(ddlsomethinhg.SelectedValue) 
     Dim QRY As String = String.Format("select * from TABLE where colname={0}", SEARCHVALUE) 
     Using cnn As New OleDbConnection("CONNECTIONSTRING") 
      If cnn.State = ConnectionState.Closed Then cnn.Open() 
      Using CMD As New OleDbCommand(QRY, cnn) 
       Using da As New OleDbDataAdapter(CMD) 
        Using ds As New DataSet 
         da.Fill(ds) 
         //if repeater2 is bounf in aspx page you will throw an exceptio so before you need to clean up datasource 
         Dim r As New Repeater 
         Repeater2.DataSourceID = "" 
         Repeater2.DataSource = ds.Tables(0) 
         Repeater2.DataBind() 
        End Using 
       End Using 
      End Using 

     End Using 
    End If 
End Sub 
+0

我不知道你是什麼意思。我不尋找任何複雜的,只是基本的工作:)謝謝。 – user2904529

+0

再次感謝您,但您的建議已經超出我的理解範圍。如果可能的話,我正在尋找類似於下面的內容。基本沒問題,因爲我需要。 – user2904529

+0

對不起@ user2904529,但它是基本的:|每個dropdonwlist上回發火災selecteindexchangedwhere你可以,你可以攔截一個值,所以創建一個新的連接,新的命令使用命令來檢索數據dataadapter和填充數據集在這一點上使用ds綁定repeater.that所有_ :) – makemoney2010