ASP.NET: Скрыть элементы CheckBox в элементе управления CheckBoxList - PullRequest
2 голосов
/ 20 сентября 2011

У меня есть привязанный к данным элемент управления 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, но мои поиски в интернете такого рода уловок оказались бесплодными, поэтому у меня есть сомнения. Спрашивать не больно, правда?

1 Ответ

1 голос
/ 20 сентября 2011

Это может сработать для вас. Он полностью удаляет элемент из списка, чтобы он вообще не отображался:

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'), чтобы скрыть / показать всю строку таблицы, которая их содержит.

...