我正在使用 ASP.NET 网络表单。我正在创建根据产品属性过滤产品的功能。
我现在这样做的方式花费了太长时间。我需要一个更好、更快的方法。
我目前的方法如下。我有一个 GridView,它显示属性名称。CheckBoxList 嵌套在包含属性值的 ItemTemplate 中。CheckBoxList 具有 autopostback="true"。在每个 selectedindexchanged 事件上,我循环检查复选框并根据选中状态进行过滤。然后我比较过滤结果和复选框值并禁用不在过滤结果中的复选框。
这是执行此操作的代码:
protected void cblAttr_SelectedIndexChanged(object sender, EventArgs e)
{
var filteredResults = ProductAttribute.Get(Convert.ToInt32(Request.QueryString["idsite"]));
var selectedAttributes = filteredResults;
foreach (GridViewRow row in gridAttrSet.Rows)
{
foreach (ListItem item in ((CheckBoxList)row.FindControl("cblAttr")).Items)
{
if (item.Selected == true)
{
// filter
selectedAttributes = selectedAttributes.Where(a => a.idAttr == Convert.ToInt32(item.Value)).ToList();
}
}
}
// this will now contain
filteredResults = (from c in filteredResults
join o in selectedAttributes
on c.idProduct equals o.idProduct
select new ProductAttribute
{
idProduct = c.idProduct,
idAttrSet = c.idAttrSet,
idAttr = c.idAttr,
}).ToList();
foreach (GridViewRow row in gridAttrSet.Rows)
{
if (row.RowIndex > ((GridViewRow)((CheckBoxList)sender).NamingContainer).RowIndex)
{
foreach (ListItem item in ((CheckBoxList)row.FindControl("cblAttr")).Items)
{
// disable if filtered out
item.Enabled = !(filteredResults.Where(a => a.idAttr == Convert.ToInt32(item.Value)).ToList().Count == 0);
}
}
}
}
如您所见,有很多循环正在进行,并且可以有数千条记录。
什么是更快的方法来做到这一点?任何想法,将不胜感激。
谢谢!