DropDownList s atributy u ListItem

Včerejší den byl ve znamení menší mystifikace. Do konference o programování v .NET přišel jednoduchý dotaz, asi následujícího znění. Při plnění ListBoxu potřebuji k jednotlivým položkám do tagu option přigenerovat ještě svoje pomocné atributy. Neváhal jsem a na jednoduchou otázku poslal celkem jednoduchou odpověď s odkazem, že třída ListItem má vlastnost Attributes, které je možné použít pro přidávání vlastních atributů.

Myšlenka to byla dobrá, až do chvíle, kdy během několika okamžiků přišla zpět odpověď, která mě zarazila. .. fyzicky se mi do HTML k tagu option ty atributy nevypíšou .... V tu chvíli mi všechno došlo, DropDownList a ListBox mají napsané metody RenderContents trochu jinak, a výpis jednotlivých položek zajišťují sami. (Třída ListItem nemá vlastní metodu Render.)

Není však třeba zoufat, i toto se dá napravit a vytvořit si vlastní webcontrol, který bude dědit z třídy DropDownList případně ListBox a přepsat mu metodu RenderContents. Pro usnadnění práce a přemýšlení jsem se o něco takového pokusil a zde je výsledek.

 [ToolboxData("<{0}:dropdownlistoptionattribute runat="server">")] 
public class DropDownListOptionAttribute: DropDownList { 
public DropDownListOptionAttribute(): base() {} 
protected override void RenderContents(HtmlTextWriter writer) { 
bool isSelected; 
ListItemCollection lic; 
ListItem li; 
isSelected = false; 
lic = base.Items; 
if (lic.Count > 0) { 
for (int i=0; i
li = lic[i]; 
writer.WriteBeginTag("option"); 
li.Attributes.Render(writer); 
if (li.Selected) { 
if (isSelected) 
throw new HttpException("Nelze vybrat více než jednu položku v DropDownListu."); 
isSelected = true; 
writer.WriteAttribute("selected", "selected"); 
} 
writer.WriteAttribute("value", li.Value, true); 
writer.Write(">"); 
HttpUtility.HtmlEncode(li.Text, writer); 
writer.WriteEndTag("option"); 
writer.WriteLine(); 
} 
} 
} 
} 

Aktualizováno [24.10.2003]: zjistil jsem, že jsem nepřevedl všechny znaky na HTML entity a tudíž kód nebyl celý.

Add a Comment