2012-09-19 4 views
0

ASP.NET Webforms를 사용하고 있습니다. 나는 그들의 속성을 기반으로 제품을 필터링하는 기능을 만들고 있습니다.제품 필터, 확인란 반복 - 빠른 프로세스

내가 지금하고있는 방식은 너무 오래 걸립니다. 나는 더 나은, 더 빠른 길을 필요로한다.

현재 나의 방법은 다음과 같습니다. 속성 이름을 표시하는 GridView가 있습니다. CheckBoxList는 속성 값을 포함하는 ItemTemplate에 중첩되어 있습니다. CheckBoxList에는 autopostback = "true"가 있습니다. 각 선택된 인덱스 변경 이벤트에서 체크 상태를 기반으로 확인란과 필터를 반복합니다. 그런 다음 필터링 된 결과와 확인란 값을 비교하고 필터링 된 결과에없는 확인란을 비활성화합니다.

은 여기에 수행하는 코드이다 : 당신이 볼 수 있듯이, 무슨 루핑 많이있다

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); 
      } 
     } 
    } 
} 

및 기록이 있습니다 수천.

더 빠른 방법은 무엇입니까? 어떤 아이디어라도 감사 할 것입니다.

감사합니다.

+1

가장 좋은 옵션은 클라이언트 측 기능을 사용하여 구현하는 것입니다. 코드 측면 이벤트보다 빠르게 손실됩니다. –

+0

시간이 얼마 남지는 모르겠지만 할 수 있어야합니다. 두 번째 중첩 루프 집합을 LINQ 문으로 바꾸고 사용하지 않도록 설정할 항목을 반환합니다. 사실, 두 세트의 중첩 된 루프를 사용하여이를 수행 할 수 있습니다. –

+0

또한 GridView HTML을 빌드하는 것과는 대조적으로 필터링이 시간을 낭비하는 곳인 지 확인 했습니까? –

답변

0

여기서 시간을 들여오는 부분은 데이터베이스 호출입니다.

관련 문제