2011-09-20 130 views
2

我有一個數據綁定的CheckBoxList控件可以增長得相當大,所以我正在嘗試爲它創建一個過濾器。下面是我在做什麼:ASP.NET:在CheckBoxList控件中隱藏複選框項目

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>元素而沒有繼承控件,這是一個「很好」的功能,我沒有時間做,所以我想知道是否有一個CSS技巧,我可以使用訪問元素的父級的父級(例如,<input type="checkbox"/> - ><td> - ><tr>)。我之前使用過: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); 
    } 
} 

更新

此基礎上你是如何想這從用戶的角度來看操作您的評論,你可能會更好在JavaScript中完成所有客戶端,而不是以這種方式在回發中完成。

在jQuery中,您可以創建一個函數,在選擇列表發生變化時運行,然後查找UserRolesList表中的所有複選框,然後遍歷它們,並根據它們的值使用.closest('tr')函數來隱藏/顯示包含它們的整個表格行。

+0

你的編輯讓我意識到我在吠叫錯誤的樹。我想盡量減少數據庫調用,但我試圖通過代碼隱藏來實現,當客戶端確實是我想要的,'.closest'就是我一直在尋找的東西。 –