WebControls erweitern
Nachdem im Forum die Frage aufkam, wie man einen LinkButton um einige Features erweitern kann, habe ich mal schnell ein kleines Beispiel zusammengebastelt:
public class MyLinkButton : LinkButton
{
private string imageUrl;
/// <summary>
/// Link des anzuzeigenden Bildes
/// </summary>
public string ImageUrl
{
get { return imageUrl; }
set { imageUrl = value; }
}
private ImageAlign imageAlign;
/// <summary>
/// Ausrichtung des anzuzeigenden Bildes
/// </summary>
public ImageAlign ImageAlign
{
get { return imageAlign; }
set { imageAlign = value; }
}
/// <summary>
/// Render Contents überschreiben
/// </summary>
protected override void RenderContents(HtmlTextWriter writer)
{
Image img = new Image();
img.ImageAlign = this.ImageAlign;
img.ImageUrl = this.ImageUrl;
img.RenderControl(writer);
base.RenderContents(writer);
}
}
Diese Klasse erbt von LinkButton und enthält zusätzlich die Eigenschaften ImageUrl (für den Pfad zum anzuzeigenden Bild) und die Eigenschaft ImageAlign (wie beim Image Control für die Ausrichtung innerhalb eines Absatzes, oder einer Zeile zuständig)
Das wichtigste ist allerdings die Methode RenderContents, mit der deren Hilfe man weitere Controls (oder einfach nur Text) innerhalb des Control hinzufügen kann.
Damit unter anderem auch etwas im Designer zu sehen ist, habe ich der Klasse folgende Attribute hinzugefügt:
[Designer("System.Web.UI.Design.WebControls.LinkButtonDesigner, "+
"System.Design")]
[DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, " +
"System.Design")]
[ParseChildren(false)]
[DefaultEvent("Click")]
[DefaultProperty("Text")]
[SupportsEventValidation, ControlBuilder(typeof(LinkButtonControlBuilder))]
[ToolboxData("<{0}:MyLinkButton runat=\"server\">LinkButton</{0}:MyLinkButton>")]
[AspNetHostingPermission(SecurityAction.LinkDemand,
Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal)]
public class MyLinkButton : LinkButton
{
}
Nachdem ich das Control wie folgt in der Seite registriert habe:
<%@ Register Assembly="WebApplication1"
Namespace="WebApplication1" TagPrefix="cc1" %>
kann es so benutzt werden:
<div>
<asp:LinkButton ID="LinkButton" runat="server">
<asp:Image ID="Image1" runat="server"
ImageUrl="calendar.gif"
ImageAlign="AbsMiddle" />Calendar
</asp:LinkButton>
<br />
<br />
<cc1:MyLinkButton ID="MyLinkButton1" runat="server"
ImageUrl="calendar.gif"
ImageAlign="AbsMiddle"
Text="Calendar" />
</div>
Zum Vergleich habe ich oben drüber das gleiche mit herkömmlichen ASP.NET Control zusammengebaut. Die resultierende Ausgabe ist die selbe:
Nur im Designer wird der Unterschied zwischen dem herkömmlichen Konstrukt und dem erweiterten Control sichtbar:

Das Beispiel Projekt (für VS 2008, die einzelnen Dateien können natürlich auch mit VS 2005 angesehen werden) kann hier heruntergeladen werden:
WebApplication1.zip (21 KB)