2009-07-05 10 views

Odpowiedz

7

Wyprowadź swoją kontrolę z WebControl następująco:

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

Oznacza to, użyć konstruktora klasy bazowej, która akceptuje tag do użycia.

0

Zazwyczaj mam własną klasę podstawową, z której dziedziczą wszystkie moje złożone elementy sterujące. Jedną z właściwości, które dodaję do tego, jest ContainerElement. Wyeksponowany publicznie programista może wybrać dowolny element zewnętrzny, jakiego oczekują. Wewnętrznie ustawia właściwość TagKey, która reguluje to renderowanie w formancie podstawowym. Wszystkie poniższe elementy do kontroli/klasy bazowej.

Wystarczy ustawić HTMLContainerElement, który będzie miał inteli-pomoc dla wszystkich elementów w wyliczeniu 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

Jeśli pochodzą z CompositeControl nie ma konstruktora, który pobiera typ tagu. Można zastąpić TagKey (nie próbowałem go), ale bardziej elastyczną opcją jest przesłonięcie metody RenderBeginTag i sprawienie, aby działała zgodnie z oczekiwaniami. Klasa podstawowa renderuje element otwierający "zakres", ale nie trzeba wywoływać metody klasy bazowej. Nie musisz niczego wywoływać, jeśli nie chcesz, aby coś zostało wyrenderowane (w takim przypadku również przesuń RenderEndTag i nie wywołuj niczego w tym miejscu). Na przykład,

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

Ten kod wytwarza

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

który jest dokładnie to, co potrzebne do tego konkretnego kompozytowego kontroli kopalni, div z klasą zawinąć kontrolę ReportViewer. Dołączam identyfikator tylko po to, aby łatwiej było znaleźć wyjście.

+0

+1 overrode tagKey i działa dobrze – Maslow