2009-07-05 5 views

risposta

7

derivare il controllo da WebControl come segue:

public class MyCustomControl : WebControl { 
    public MyCustomControl() : base(HtmlTextWriterTag.Div) {} 
} 

Cioè, utilizzare il costruttore della classe base che accetta il tag da usare.

0

Normalmente ho una mia classe base da cui ereditano tutti i miei controlli compositi. Una delle proprietà che aggiungo a questo è un ContainerElement. Pubblicamente esposto, lo sviluppatore può scegliere qualsiasi elemento esterno che vogliono. Internamente imposta la proprietà TagKey che governa questo rendering sul controllo di base. Tutto quanto segue al tuo controllo/classe base.

Hai solo bisogno di impostare HTMLContainerElement che avrà l'inteli-aiuto di tutti gli elementi nell'enumerazione HtmlTextWriterTag.

/// <summary> 
/// Local variable for storing what the container element for the rendered control will be. 
/// </summary> 
private HtmlTextWriterTag hosTagKey = HtmlTextWriterTag.Span; 

/// <summary> 
/// HTMLContanerElement is the tag key used to set the controls outer html control which appears in the markup. 
/// The default is a span, but you can change this to be any HTML control you choose. 
/// </summary> 
public HtmlTextWriterTag HTMLContainerElement 
{ 
    get { return this.hosTagKey; } 
    set { this.hosTagKey = value; } 
} 

/// <summary> 
/// Makes it so this control is a "div" element instead of the 
/// standard "span" element. 
/// </summary> 
protected override HtmlTextWriterTag TagKey 
{ 
    get { return this.hosTagKey; } 
} 
3

Se si deriva da CompositeControl non esiste un costruttore che accetta un tipo di tag. Puoi sovrascrivere TagKey (non l'ho provato), ma un'opzione più flessibile è quella di sovrascrivere il metodo RenderBeginTag e farlo fare ciò che vuoi. La classe base rende un elemento di apertura "span", ma non è necessario chiamare il metodo della classe base. Non è necessario chiamare nulla se non si desidera rendere nulla il rendering (nel qual caso, anche sovrascrivere RenderEndTag e non chiamare nulla neanche lì). Ad esempio,

public override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.AddAttribute(HtmlTextWriterAttribute.Class, "reportViewer"); 
     writer.AddAttribute(HtmlTextWriterAttribute.Id, "QueryViewerWrapper"); 
     writer.RenderBeginTag(HtmlTextWriterTag.Div); 
    } 

Questo codice produce

<div class="reportViewer" id="QueryViewerWrapper"> 

che è esattamente quello che mi serviva per questo particolare controllo composito di mio, un div con una classe per avvolgere un controllo ReportViewer. Includo l'ID solo per rendere più facile l'individuazione dell'output.

+0

+1 overrode tagKey e funziona bene – Maslow

Problemi correlati