06/07/2013 Development / asp.net

Esse código é referente a uma customização de controle fazendo um override na classe RadioButtonList no framework 3.5

No framework 4.5 não precisa disso porque o controle tem alguns outros tipos de listagem.

Porque dessa customização? 

No framework 3.5 o RadioButtonList gera uma lista fora dos padrões da atualidade. Tipo gerando table, tr, td...Enfim, meio zuado. Então esse codigo serve pra tirar o lixo e deixar só oque você vai usar mesmo.

public class HtmlTextWriterNoSpan : HtmlTextWriter {
    ///Text writer.
    public HtmlTextWriterNoSpan(TextWriter textWriter) : base(textWriter)  { }
    
    protected override bool OnTagRender(string name, HtmlTextWriterTag key)  {
        // Do not render tags
        if (key == HtmlTextWriterTag.Span)
        return false;
        
        return base.OnTagRender(name, key);
    }
}

public class CustomRadioButtonList : RadioButtonList {

    protected override void Render(HtmlTextWriter writer) {
        // Use custom writer
        writer = new HtmlTextWriterNoSpan(writer);
        base.Render(writer);
    }

    protected override void RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer){
        HtmlGenericControl li = new HtmlGenericControl("li");
        
        li.Attributes.Add("class", "it");
        li.Page = this.Page;
        
        ListItem item = this.Items[repeatIndex];
        RadioButton radioButton = new RadioButton();
        radioButton.Page = this.Page;
        radioButton.GroupName = this.UniqueID;
        radioButton.ID = this.ClientID + "_" + repeatIndex.ToString();
        radioButton.Text = this.Items[repeatIndex].Text;
        radioButton.Attributes["value"] = this.Items[repeatIndex].Value;
        radioButton.Checked = this.Items[repeatIndex].Selected;
        radioButton.TextAlign = this.TextAlign;
        radioButton.AutoPostBack = this.AutoPostBack;
        radioButton.TabIndex = this.TabIndex;
        radioButton.Enabled = this.Enabled;
        
        //radioButton.CssClass = "it";
        //radioButton.Style.Add(HtmlTextWriterStyle.BackgroundColor, this.Items[repeatIndex].Text);
        li.Controls.Add(radioButton);
        
        //writer.RenderBeginTag(HtmlTextWriterTag.Li);
        //writer.Write(item.Text);
        //writer.RenderEndTag();
        
        li.RenderControl(writer);
    }
}

Chamando o controle.

lstCampo = new CustomRadioButtonList();
lstCampo.ID = string.Format("seleciona-{0}", Campo);
lstCampo.CssClass = string.Format("lista-{0} radio-{0} customRadio", Campo);
((RadioButtonList)lstCampo).RepeatLayout = RepeatLayout.Flow;
((RadioButtonList)lstCampo).RepeatDirection = RepeatDirection.Horizontal;
lstCampo.AutoPostBack = true;

Espero que sirva.