vrijdag 25 november 2011

LinkButtons als DefaultButton in ASP.NET

Vaak gebruiken we LinkButtons als alternatief voor 'normale' buttons. Nadeel hiervan is dat je een LinkButton niet als DefaultButton in kunt stellen op een Panel. Daardoor kun je helaas de enter-toets niet gebruiken op die knop.

Zojuist kwam ik hiervoor een oplossing tegen. Je maakt een custom control die overerft van System.Web.UI.WebControls.LinkButton. Deze custom control voegt een stukje javascript toe aan je pagina, waarmee de DefaultButton wél werkt!

using System;
using System.Web.UI;

namespace BISBV.GUI.TemplateControls
{
public class BISBVLinkButton : System.Web.UI.WebControls.LinkButton
{
private const string _addClickScript = "AddDefaultButtonClickFn('{0}');";
private const string _addClickFunctionScript =
@"function AddDefaultButtonClickFn(id) {{
var b = document.getElementById(id);
if (b && typeof(b.click) == 'undefined') b.click = function() {{
var result = true; if (b.onclick) result = b.onclick();
if (typeof(result) == 'undefined' || result) {{ eval(b.getAttribute('href')); }}
}}}};";

protected override void OnLoad(System.EventArgs e)
{
// Registreer de JavaScript-functie voor de DefaultButton.
ScriptManager.RegisterStartupScript(this, this.GetType(), "addClickFunctionScript", _addClickFunctionScript, true);
// Voeg op deze LinkButton een StartupScript toe.
ScriptManager.RegisterStartupScript(
this,
this.GetType(),
"click_" + ClientID,
string.Format(_addClickScript, ClientID),
true);

base.OnLoad(e);
}
}
}

Omdat we ASP.NET AJAX gebruiken worden de stukjes JavaScript geregistreerd via de ScriptManager. Als je geen AJAX gebruikt vervang je dit voor 'ClientScript'.

Geen opmerkingen:

Een reactie posten