ListView DataBind排序值

时间:2014-10-17 12:27:56

标签: c# asp.net listview

我希望有一个DropdownMenu我可以从中选择我想要对ListView进行排序的方式。 这是我目前的代码:

<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天)。

2 个答案:

答案 0 :(得分: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(); } 中指定的那个):

    GetProducts
  3. 最后在if ("DesDate".Equals(DropDownSelect.SelectedItem.Value)) { query = query.OrderByDescending(u => u.ReleaseDate); } 注意,LINQ调用不会更新当前对象,而是每次都会生成新对象。所以你应该有这样的东西:

    {{1}}

答案 1 :(得分: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()等任何To方法以及任何迭代它的尝试(例如:

)之前,此类不会产生结果。
Foreach(var thing in MyQuerable){  //results are here }