Peter Bucher - Mein Experiment, meine Spielereien, meine Welt...   ·   Stefan Falz   ·   Jürgen Gutsch   ·   Golo Roden   ·   ASP.NET Zone   ·   Microsoft ASP.NET
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

WaitButtonControl - Auf langes Postback warten

Wieder einmal (wie immer :-), wurde ich durch eine Frage im Forum angeregt.
Es ging darum, einen Button zu haben, der nach dem Klicken sofort deaktiviert wird, einen Hinweistext darstellt und trotzdem noch ein normales PostBack inkl. "Absenderadresse" versendet.

Die Lösung war am Ende folgende (Im Page_Load bspw.):

this.<Button>.Attributes.Add("onclick", "this.disabled = true; this.value = 'Bitte warten...'; " + ClientScript.GetPostBackEventReference(<Button>, null));

Nun gut, es funktioniert, ist relativ schnell geschrieben - aber:

  • Man muss es trotzdem immer wieder schreiben
  • Es ist schlussendlich Code, der das Gesamtbild aufbläht
  • Wenn man eine zusätzliche Funktionalität möchte, muss man es überall nachtragen
  • Schlussendlich endet das in der Copy&Paste Hell ;-)

Genau für so etwas ist ein ASP.NET CustomControl sehr gut geeignet.
Es folgt der Quellcode des Controls und ein Beispiel zum Herunterladen und Probieren.

WaitButton.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;



namespace t4m.Controls
{
    [DefaultProperty("WaitText")]
    public class WaitButton : Button
    {
        private const string DefaultWaitText = "Bitte warten...";

        private bool _wait       = true;
        private string _waitText = DefaultWaitText;

        public bool Wait {
            get { return this._wait; }
            set { this._wait = value; }
        }

        public string WaitText {
            get { return this._waitText; }
            set { this._waitText = value; }
        }

        protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
        {
            if (this._wait)
                writer.AddAttribute("onclick",
                    "this.disabled = true;" +
                    "this.value    = '" +
                    (this._waitText == DefaultWaitText ? DefaultWaitText : this._waitText) +
                    "';" +
                    Page.ClientScript.GetPostBackEventReference(this, null));

            base.AddAttributesToRender(writer);
        }
    }
}

Beispielprojekt:

Weiterführende Links:

Veröffentlicht Donnerstag, 31. Mai 2007 23:56 von Peter Bucher

Kommentare

# Alles neu oder was?

Info &amp; Statistiken Ja, es gibt Neuigkeiten auf meinem Blog, aber es ist nicht alles neu ;-) Unter

Freitag, 24. August 2007 01:45 by Peter Bucher
Anonyme Kommentare sind nicht zugelassen