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ますが、この種のトリックの Web 検索は無駄だったので、疑問があります。でも聞いて損はありませんよね?

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 に答える