2011-09-20 1 views
2

데이터 바운드 CheckBoxList 컨트롤이 상당히 커질 수 있으므로 필터를 만들려고합니다. 여기에 내가 뭘하는지입니다 : 이것은 주로 작동ASP.NET : CheckBoxList 컨트롤의 CheckBox 항목 숨기기

foreach(ListItem item in this.UserRolesList.Items) { 
    if(!item.Value.StartsWith(this.RolesFilterList.SelectedValue)) { 
     item.Attributes.CssStyle["display"] = "none"; 
    } else item.Attributes.CssStyle["display"] = "inline"; 
} 

를 제외하고 ASP.NET은 CheckBoxList를 렌더링 할 때, 그렇게 자신의 <TR> 요소 내에 중첩 된 각 CheckBox 컨트롤과 함께 테이블을 사용하여 않습니다. 즉,보고 싶지 않은 항목이 표시되지 않더라도 행의 공백이 있으므로 여전히 만족해야 할 백인 페이스가 상당합니다.

컨트롤을 서브 클래 싱하지 않고 <TR> 요소에 액세스 할 수 있다는 것을 알지 못합니다.이 기능은 "할 가치가없는 기능"이므로 시간이 없으므로 요소의 부모 부모 (예 : <input type="checkbox"/> -><td> -><tr>)에 액세스하는 데 사용할 수있는 CSS 트릭입니다. 이전에 :first-child 의사 요소를 사용했지만 웹에서 이러한 종류의 트릭을 검색하는 것이 효과적이지 않으므로 의심 스럽습니다. 그래도 아프지 않을거야. 그렇지?

+4

체크 박스 목록에 바인딩하기 전에 데이터 소스를 필터링 할 수없는 이유가 있습니까? – patmortech

+1

'RepeatLayout'으로 테이블 렌더링을 중단 할 수 있습니다 : http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkboxlist.repeatlayout.aspx – bgs264

+0

@patmortech 사용자가 필터링, 값 변경, 필터, 값 변경 등을 수행하고 양식의 저장 버튼을 클릭해야하므로 데이터베이스를 반복적으로 호출하는 것이 더 효율적입니다. –

답변

1

이 방법이 유용 할 수 있습니다. 그것은 전혀 렌더링되지 않습니다 완전히 있도록 목록에서 항목을 제거합니다

string value = this.RolesFilterList.SelectedValue; 
int count = this.UserRolesList.Items.Count - 1; 

for(var i=count;i>=0;i--) 
{ 
    ListItem item = this.UserRolesList.Items[i]; 
    if (!item.Value.StartsWith(value)) 
    { 
     this.UserRolesList.Items.RemoveAt(i); 
    } 
} 

업데이트를 당신이 원하는 방법이 사용자의 관점에서 작업하려는 위의 의견을 바탕으로

, 당신 이 방식으로 포스트 백에서 수행하는 것이 아니라 자바 스크립트에서이 모든 클라이언트 측을 수행하는 것이 더 나을 것입니다.

jQuery에서 선택 목록이 변경된 후 UserRolesList 테이블의 모든 확인란을 찾은 다음 루프를 반복하면서 해당 값을 기준으로 .closest('tr') 함수를 사용하여 숨기기/그들을 포함하는 전체 테이블 행을 보여줍니다.

+0

당신의 편집은 제가 잘못된 나무를 짖고 있음을 깨닫게했습니다. 데이터베이스 호출을 최소화하고 싶었지만 클라이언트 측이 실제로 원했던 코드 숨김을 통해이 작업을 수행하려고 시도했으며'.closest '는 내가 찾고있는 것입니다. –