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: