Home   Cover Cover Cover Cover
 

Selbstgeschriebene Steuerelemente (Custom Controls)


Zu Abschnitt 6.6.2 des Buchs

Dies ist ein Beispiel für ein selbstgeschriebenes Steuerelement, das dazu dient, Textstücke zu falten (d.h. zu kollabieren und wieder zu expandieren). Das Steuerelement ist als Klasse Fold realisiert, die von einem ImageButton abgeleitet ist:

../../samples/6/Fold.cs
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace Folds {

[ParseChildren(false)]
public class Fold : ImageButton {
  
  public event EventHandler FileNotFound;
  
  public string Text {
    get { return ViewState["Text"]==null ? "" : (string)ViewState["Text"]; }
    set { ViewState["Text"] = value; }
  }
  
  public string Icon {
    get { return ViewState["Icon"]==null ? "Solid" : (string)ViewState["Icon"]; }
    set { ViewState["Icon"] = value; }
  }
  
  public Fold() : base() {
    Click += new ImageClickEventHandler(FoldClick);
  }
  
  protected override void AddParsedSubObject(object obj) {
    if (obj is LiteralControl) AlternateText = ((LiteralControl)obj).Text;
  }
  
  void FoldClick(object sender, ImageClickEventArgs e) {
    string s = Text;
    Text = AlternateText;
    AlternateText = s;
    if (Icon == "Solid") Icon = "Hollow"; else Icon = "Solid";
  }
  
  protected virtual void OnFileNotFound(EventArgs e) {
    if (FileNotFound != null) FileNotFound(this, e);
  }
  
  protected override void OnClick(ImageClickEventArgs e) {
    try {
      if (AlternateText.StartsWith("@")) {
        string fileName = Page.MapPath(TemplateSourceDirectory) 
          + "/" + AlternateText.Substring(1);
        FileStream s = File.OpenRead(fileName);
        StreamReader r = new StreamReader(s);
        AlternateText = r.ReadToEnd();
      }
    } catch (FileNotFoundException) {
      OnFileNotFound(EventArgs.Empty);
    } finally {
      base.OnClick(e);
    }
  }
  
  protected override void Render(HtmlTextWriter w) {
    w.Write("this.UniqueID);
    w.Write(" src='" + TemplateSourceDirectory + "/" + Icon + "Left.gif' border=0 />");
    w.Write(Text);
    w.Write("");
  }
}
}

Diese Klasse muß in eine DLL übersetzt werden, die im /bin-Verzeichnis des virtuellen Verzeichnisses gespeichert wird. Das Übersetzungskommando lautet:

  csc /target:library /out:bin/Folds.dll Fold.cs

Nun kann das Steuerelement in einer aspx-Seite verwendet werden:

../../samples/6/Fold.aspx
<%@ Page Language="C#" %>
<%@ Register TagPrefix="my" Namespace="Folds" Assembly="Folds" %>
<html>
  <body>
    <form Runat="server">
      <my:Fold Text="Bitte lesen!" Runat="server">
        ASP.NET erlaubt die Entwicklung eigener Web-Steuerelemente, die nahezu
        unbeschr&auml;nkte M&ouml;glichkeiten f&uuml;r neue
        Web-Funktionalit&auml;t er&ouml;ffnen.
      </my:Fold>
    </form>
  </body>
</html>

Ausführung

   http://dotnet.jku.at/book/samples/6/Fold.aspx

Ergebnis