2012-12-20 6 views
6

Ho un CheckBoxList (versione framework 4), con il RepeatLayout impostato su UnOrderedList. Mi piacerebbe generare una classe su ogni LI per semplificare la codifica e lo stile del client, tuttavia, non riesco a ottenerlo.Custom rendering Articoli CheckBoxList per avere una classe impostata su LI

ho l'override del metodo RenderItem come segue:

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>"); 
} 

Tuttavia, ottenere un carico della LIS vuoti generati, quindi ovviamente essi vengono resi nel chiamante, o da qualche altra parte, e non posso per la vita di me funziona dove.

Ottenuto attorno ad esso ora aggiungendo la classe a ListItems, ma crea uno SPAN aggiuntivo che preferirei perdere.

C'è qualche buon modo per farlo?

MODIFICA: Questa è una demo ridotta; la versione finale avrà la logica per generare classi diverse in base alle proprietà degli elementi di dati originali, nel caso in cui qualcuno si chieda perché ho bisogno di aggiungere una classe a tutti.

EDIT 2: ora ho ottenuto intorno al mio problema immediato di semplificare il markup cambiando la RenderItem di utilizzare lo stile dell'etichetta-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>"); 

mi piace ancora di sapere se c'è comunque un modo per personalizzare completamente il rendering degli oggetti.

risposta

1

In caso PreRender, scorrere tra gli elementi-Collection, e assegnare le classi di cui hai bisogno:

For Each l As ListItem In Items 
    If l.Value = "1" Then 
    l.Attributes.Add("class", "myClass") 
    End If 
Next l