Mehr von Jürgen Gutsch

Mehr von Jürgen Gutsch

Empfehlungen von Jürgen Gutsch

Blog-Empfehlungen von Jürgen Gutsch

Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Jürgen Gutsch

ASP.NET und mehr...
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)

Posted: Donnerstag, 17. April 2008 10:00 von Jürgen Gutsch

Kommentare

Peter Bucher sagte:

Nett :)

# April 17, 2008 17:31

Jürgen Gutsch sagte:

Hiermit starten Peter und ich mal eine kleine Artikelserie zur Erstellung von Web Server Controls. Vielfach

# Februar 13, 2009 10:09
Anonyme Kommentare sind nicht zugelassen