我希望有一个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> </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 :(得分:2)
让我们一步一步修复您的代码。
事件处理程序需要具有特定签名。在我能记住的每个ASP.NET控件的情况下,它们需要接收两个参数,事件参数和事件源对象,并返回void。另请注意,仅调用GetProduct
不会更新ListView
,我们需要触发控件本身的数据绑定。我们稍后会谈到。现在让我们介绍一个合适的处理程序:
public void DropDownSelect_SelectedIndexChanged(object sender, EventArgs e)
不要忘记更新标记:
OnSelectedIndexChanged="DropDownSelect_SelectedIndexChanged"
您在ListView
中显示数据的条件已发生变化。这意味着您需要通过调用DataBind
来重新绑定它,该GetProducts
应调用SelectMethod
(作为public void DropDownSelect_SelectedIndexChanged(object sender, EventArgs e)
{
productList.DataBind();
}
中指定的那个):
GetProducts
最后在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 }