2009-07-05 10 views

Respuesta

7

Deducir de su control de WebControl de la siguiente manera:

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

Es decir, utilizar el constructor de la clase base que acepta la etiqueta de usar.

0

que normalmente tienen mi propia clase base que todos mis controles compuestos heredan de. Una de las propiedades que agrego a esto es un ContainerElement. Expuesto públicamente, el desarrollador puede elegir el elemento externo que quiera. Internamente establece la propiedad TagKey que rige esta representación en el control base. Todo lo siguiente a su clase de control/base.

Solo necesita establecer HTMLContainerElement que tendrá la inteli-ayuda de todos los elementos en la enumeración 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

Si proviene de CompositeControl no hay un constructor que tome un tipo de etiqueta. Puede anular TagKey (no lo he probado), pero una opción más flexible es anular el método RenderBeginTag y hacer que haga lo que quiera. La clase base representa un elemento de apertura "span", pero no tiene que llamar al método de clase base. No tiene que llamar nada si no desea que se reproduzca algo (en cuyo caso también anula RenderEndTag y tampoco llama a nada). Por ejemplo,

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

Este código produce

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

que es exactamente lo que necesitaba para este control compuesto particular de la mía, un div con una clase para envolver un control ReportViewer. Incluí la ID solo para hacer que la salida sea más fácil de detectar.

+0

+1 overrode tagKey y funciona bien – Maslow

Cuestiones relacionadas