2014-10-17 92 views
0

我想有一個DropdownMenu從中我可以選擇我想如何排序我的ListView。 這是我爲它當前的代碼:ListView DataBind排序值

<asp:DropDownList ID="DropDownSelect" runat="server" AutoPostBack="True" 
    OnSelectedIndexChanged="GetProducts"> 
     <asp:ListItem Selected="True" Value="DesDate"> Descending Date </asp:ListItem> 
     <asp:ListItem Value="AsDate"> Ascending Date </asp:ListItem> 
     <asp:ListItem Value="AsAlp"> Ascending Alphabetical </asp:ListItem> 
     <asp:ListItem Value="DesAlp"> Decentind Alphabetical </asp:ListItem> 
</asp:DropDownList> 

而且我有這個ListView顯示我的數據:

<asp:ListView ID="productList" runat="server" 
    DataKeyNames="NewsID" GroupItemCount="1" 
    ItemType="SiteStiri.Models.News" SelectMethod="GetProducts"> 
     <EmptyDataTemplate> 
      <table> 
      <tr> 
       <td>No data was returned.</td> 
      </tr> 
      </table> 
     </EmptyDataTemplate> 
     <EmptyItemTemplate> 
      <td/> 
     </EmptyItemTemplate> 
     <GroupTemplate> 
      <tr id="itemPlaceholderContainer" runat="server"> 
       <td id="itemPlaceholder" runat="server"></td> 
      </tr> 
     </GroupTemplate> 
     <ItemTemplate> 
      <td runat="server"> 
     <table> 
      <tr> 
      <td> 
       <a href="NewsDetails.aspx?newsID=<%#:Item.NewsID%>"> 
       <img src="/Catalog/Images/Thumbs/<%#:Item.ImagePath%>" 
      width="100" height="75" style="border: solid" /></a> 
      </td> 
     </tr> 
     <tr> 
      <td> 
      <a href="NewsDetails.aspx?newsID=<%#:Item.NewsID%>"> 
       <p style="color: black;"> 
        <%#:Item.NewsTitle%> 
       </p> 
      </a> 
      </td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
     </tr> 
     </table> 
     </p> 
    </td> 
    </ItemTemplate> 
    <LayoutTemplate> 
     <table style="width:100%;"> 
      <tbody> 
      <tr> 
       <td> 
       <table id="groupPlaceholderContainer" runat="server" 
        style="width:100%"> 
       <tr id="groupPlaceholder"></tr> 
       </table> 
       </td> 
       </tr> 
      <tr> 
      <td></td> 
      </tr> 
     <tr></tr> 
     </tbody> 
    </table> 
    </LayoutTemplate> 
    </asp:ListView> 

,我不知道如何做的事情是: 選擇排序後規則從下拉菜單中,我無法弄清楚如何寫(或在哪裏寫)將更新我的ListView的方法,因爲它應該。我試圖是:

public IQueryable<News> GetProducts() 
     { 
      var _db = new SiteStiri.Models.NewsContext(); 
      IQueryable<News> query = _db.News; 

      if (("DesDate").Equals(DropDownSelect.SelectedItem.Value)) 
      { 
       query.OrderByDescending(u => u.ReleaseDate); 
      } 
      if (("AsDate").Equals(DropDownSelect.SelectedItem.Value)) 
      { 
       query.OrderBy(u => u.ReleaseDate); 
      } 
      if (("AsAlp").Equals(DropDownSelect.SelectedItem.Value)) 
      { 
       query.OrderBy(u => u.NewsTitle); 
      } 
      if (("DesApl").Equals(DropDownSelect.SelectedItem.Value)) 
      { 
       query.OrderByDescending(u => u.NewsTitle); 
      } 


      return query; 
     } 

這給了我一堆的錯誤,它甚至不工作....請一點點的幫助?我是新來的(2天)。

+0

下面是開始的地方:'.OrderBy'和'.OrderByDescending'不能排序:它們會返回一個新的對象。所以你需要將'query.OrderBy(etc)'的結果賦給一個變量並返回該變量。 – 2014-10-17 12:35:36

+0

謝謝你的提示!我是在正確的軌道上,但可能不能想出查詢=查詢..... – 2014-10-17 13:10:32

回答

2

讓我們一步一步修復您的代碼。

  1. 事件處理程序需要有一定的簽名。在我記得的每一個ASP.NET控件的情況下,它們都需要接收兩個參數,事件參數和事件源對象,並返回void。還要注意,只是調用GetProduct不會更新ListView,我們需要觸發控件本身的數據綁定。我們將在稍後討論。現在我們來介紹一個合適的處理程序:

    public void DropDownSelect_SelectedIndexChanged(object sender, EventArgs e) 
    

    不要忘了更新標記,以及:

    OnSelectedIndexChanged="DropDownSelect_SelectedIndexChanged" 
    
  2. 的條件你如何顯示在ListView數據已經改變。這意味着,你需要調用DataBind重新綁定,這應該叫GetProducts(如SelectMethod指定一個):

    public void DropDownSelect_SelectedIndexChanged(object sender, EventArgs e) 
    { 
        productList.DataBind(); 
    } 
    
  3. 終於在GetProducts注意,LINQ調用不更新當前對象,而是他們每次都會產生新的。所以,你應該有這樣的事情:

    if ("DesDate".Equals(DropDownSelect.SelectedItem.Value)) 
    { 
        query = query.OrderByDescending(u => u.ReleaseDate); 
    } 
    
+0

謝謝您花時間來幫助我!你的指針比任何人都可以問的要多! <3(你告訴我的是比指針更完整的解決方案:))) – 2014-10-17 13:11:34

0

我猜你想要的數據,而不是查詢嗎?該代碼看起來像這樣,你所要做的就是分析選定的值並將其傳遞給方法。如果ListView綁定到數據(它應該是),你就全部設置好了。這個例子顯示了問題的分離,其中視圖只是一個如何顯示數據的框架,而後面的代碼是基於視圖觸發器提供WHAT數據的框架。這種情況下的觸發器是「過濾器」參數。最後

List<News> query = _db.News.ToList(); 
public List<News> GetProduct(string filter) { 

    if (filter == "DesDate") return query.OrderByDescending(u => ReleaseDate).ToList(); 

} 

一個注意:IQueryable的是一類,可以讓你通過查詢周圍,你可以改變查詢本身從方法到方法。但是,直到它被告知通過使用任何要像ToList(),ToArray的(),ToLookup(方法這樣做此類不產生效果)和或任何企圖在重複它,例如:

Foreach(var thing in MyQuerable){ //results are here }