2

我有一个可以变得非常大的数据绑定 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"/>-> <td>-> <tr>)。我之前用过:first-child伪元素,但是我的网络搜索这种技巧没有结果,所以我有我的怀疑。不过问也无妨,对吧?

4

1 回答 1

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')函数隐藏/显示整个表行包含它们。

于 2011-09-20T17:56:40.563 回答