我有一个数据绑定的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时,它使用一个表,每个CheckBox控件嵌套在它自己的<TR>
元素中,这几乎可以工作。这意味着即使我不想看到的项目没有显示,它们的行的空白区域也是如此,所以我还需要满足一些白色的步伐。
我不知道我可以在没有继承控件的情况下访问<TR>
元素,这是一个“不错的”功能,我没有时间去做,所以我想知道如果有一个CSS技巧我可以用来访问元素的父母的父母(例如,<input type="checkbox"/>
- &gt; <td>
- &gt; <tr>
)。我之前使用过:first-child
伪元素,但是我的网络搜索这种技巧没有结果,所以我有疑虑。不过可以问一下,对吗?
答案 0 :(得分: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')
函数隐藏/显示包含它们的整个表行。