ASP.NET动态数据:在侧栏中显示过滤条件的动态列表

时间:2012-03-16 20:06:04

标签: asp.net dynamic-data asp.net-dynamic-data

我有一组用户可以选择的类别。 每个类别都有一组用户可能想要过滤的不同属性。

每个类别中的项目都显示在网格视图中。每个类别都有自己的网格视图网页。

当显示网格视图时,我想要一个侧栏来显示与该类别相关的属性。用户应该能够选择要过滤的属性。并按属性上的最小/最大值进行过滤。

我正在尝试确定侧边栏中应该包含哪些控件,以及如何动态填充控件集(假设每个控件都是不同的属性过滤器)。

例如,查看Amazon books侧边栏有动态生成的过滤器列表,这些过滤器与书籍类别有关。

其他不错的功能是:

  • 更改属性列表,以便只显示将产生结果的属性/过滤器。

  • 让每个属性/过滤器显示选中后将显示的结果数。

2 个答案:

答案 0 :(得分:3)

我真的不知道你将如何加载gridview,但这就是我能够做类似的事情。

假设您通过SQL查询将数据传输到GridView:

select property1, property2, property3, ...., from categoryA

侧视图中的任何内容都应该以某种方式考虑到您的SQL查询,每个都有自动回发。

<asp:TextBox runat="server" AutoPostBack="true" ID="Property1" /> 

所以当它回发到服务器时,在你的页面加载方法中:

protected void Page_Load(object sender, EventArgs e) 
{
    if(IsPostBack)
    { 
        UpdateCategoryQuery();
    }
}

在您的UpdateCategoryQuery()方法上:

private void UpdateCategoryQuery()
{
    if(Property1.Text != "") 
    {
        string sql = "where property1 = '" + Property1.Text + "'";
    }
    //... and go on down the list.   
}  

最后,您需要阅读此查询并使用.DataSource和.DataBind()将数据绑定到GridView;

这是一个非常简单的例子,但我并不确切地知道你在寻找什么,所以我希望这可以帮助你。

编辑:此处的查询可能会变得相当复杂,具体取决于您过滤数据的属性数量,因此您可能需要花一些时间来构建它以确保其正确运行。

答案 1 :(得分:0)

  

我是ASP.NET的新手,因此我无法找到要完成的控件   此

没有开箱即用的任何控件,可以实现此目的。你必须建立自己的。

这可能不是你想象的方式,但希望你可以推断:

由于您知道要绑定到gridview的对象类型,因此请创建一个下拉框,其中包含用户可以筛选的属性列表。在下拉列表旁边放置一个min和一个max文本字段,以便用户可以在这些字段中输入所需的任何值。像这样:

<asp:dropdownlist id="properties" runat="server">
 <ListItem Text="Color" Value="Color" />
 <ListItem Text="Size"  Value="Size"/>
 <ListItem Text="Price" Value="Price"/>
</asp:dropdownlist>
<asp:Textbox id="min" runat="server" />
<asp:Textbox id="max" runat="server" />
<asp:Button id="btnFilter" Click="Filter" Text="Filter" />

protected void Filter(object sender, EventArgs e)
{
   string minVal = min.Text;
   string maxVal = max.Text;
   string filterProperty = properties.SelectedValue;

   //Now filter your data using the property name and the min and max values
   //you can use Linq to do this quickly. 
   //If binding to a DataTable, use DataTable.Select method and rebind again

}