7

CheckBoxList(フレームワークバージョン4)があり、RepeatLayoutがUnOrderedListに設定されています。クライアント側のコーディングとスタイリングを簡素化するために、各LIでクラスを生成したいのですが、取得できません。

RenderItemメソッドを次のようにオーバーライドします。

protected override void RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)
{
    ListItem item = Items[repeatIndex];
    String id = ClientID + "_" + repeatIndex.ToString();
    String name = UniqueID + "$" + repeatIndex.ToString();

    writer.Write(@"<li class='{0}'>", "tcsdrp_day" + (item.Selected ? " selected" : ""));
    writer.Write(@"<input id='{0}' type='checkbox' name='{1}' value='{2}'>", new object[] { id, name, item.Value });
    writer.Write(@"<label for='{0}'>{1}</label>", new object[] { id, item.Text });
    writer.Write(@"</li>");
}

ただし、大量の空白のLIが生成されるため、明らかにそれらは呼び出し元または別の場所でレンダリングされており、私の人生のどこで解決することはできません。

ListItemsにクラスを追加することで問題を回避しましたが、これにより、理想的には失いたい余分なSPANが作成されます。

これを行う良い方法はありますか?

編集:これは削減されたデモです。最終バージョンには、クラスを追加する必要がある理由を誰かが疑問に思っている場合に備えて、元のデータ項目のプロパティに基づいてさまざまなクラスを生成するロジックがあります。

編集2:RenderItemを変更してlabel-wrapping-the-inputスタイルを使用することにより、マークアップを単純化するという当面の問題を回避しました。

writer.Write(@"<label class='{0}'>", labelclass);
writer.Write(@"<input id='{0}' type='checkbox' name='{1}' value='{2}'{3}>", new object[] { id, name, item.Value, item.Selected ? " checked" : "" });
writer.Write(item.Text);
writer.Write(@"</label>");

ただし、アイテムのレンダリングを完全にカスタマイズする方法があるかどうかはまだ知りたいです。

4

1 に答える 1

1

PreRender イベントで、Items-Collection を反復処理し、必要に応じてクラスを割り当てます。

For Each l As ListItem In Items
  If l.Value = "1" Then
    l.Attributes.Add("class", "myClass")
  End If
Next l
于 2013-05-24T09:58:57.077 に答える