Degree Blogg
2Mar/120

ASP.NET – Cross browser default button

Posted by Andreas

We have previously covered default buttons both in Silverlight and generic ASP.NET (both in Norwegian, but the code samples know no language barriers). I thought I’d add a third post about this, because the generic ASP.NET default button only shows the simplest approach – which is not fully browser independent. It works great in Internet Explorer, but if you want to make sure it also works in other browsers like Chrome and Firefox a more thorough approach is required.

I solved this by creating a new class that inherits from System.Web.UI.WebControls.LinkButton. In the OnLoad event, a script is added to the page which handles the click event for the link button. I would add a reference to the source of the script if I had it, but unfortunately that’s long gone.

Create a new class called LinkButtonDefault.cs and add the following code:

using System;
using System.Web.UI.WebControls;

namespace My.Very.Own.Namespace
{
    public class LinkButtonDefault : LinkButton
    {
        protected override void OnLoad(System.EventArgs e)
        {
            Page.ClientScript.RegisterStartupScript(GetType(), "addClickFunctionScript",
                _addClickFunctionScript, true);

            string script = String.Format(_addClickScript, ClientID);
            Page.ClientScript.RegisterStartupScript(GetType(), "click_" + ClientID,
                script, true);
            base.OnLoad(e);
        }

        private const string _addClickScript = "addClickFunction('{0}');";

        private const string _addClickFunctionScript =
            @"  function addClickFunction(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')); }}
            }}}};";
    }
}

 

At the top of the page where you want your custom default link button, register the component and give it a tag prefix:

<%@ Register TagPrefix="UR" Namespace="My.Very.Own.Namespace" Assembly="Name.Of.Your.Assembly, Version=1.0.0.0,  Culture=neutral, PublicKeyToken=3011884815bf2cfd" %>

 

Replace namespace, assembly name and public key token with your corresponding values. Then create a button based on your inherited class (using the tag prefix defined in the previous step):

<UR:LinkButtonDefault ID="lnkContinue" runat="server" onclick="btnContinue_Click">

 

Wrap the button inside a panel, and set the DefaultButton parameter to your button:

<asp:Panel ID="Panel1" runat="server" DefaultButton="lnkContinue">
27Aug/100

Silverlight 4 Default button

Posted by Andreas

Silverlight har ikke den innebygde Default button propertien som støttes i for eksempel Panels i ASP.NET. For de utviklerne som lever et liv i skyggen sørger denne for at du kan peke på en control innenfor et panel hvor Click event skal kalles når brukeren trykker Enter. Et typisk eksempel er en login-side hvor Enter simulerer trykk på Log in-knappen.

Silverlight / XAML har ikke denne muligheten - merkelig nok. Det er derfor en del fremgangsmåter rundt på nettet, men denne her er grei og fungerer i Silverlight 4.

Denne koden er frekt og freidig (og sikkert uten samtykke) lånt av Patrick Cauldwell - men siden jeg gir ham cred så er det sikkert greit.

1. Opprett en klasse i prosjektet, kall denne DefaultButtonService

2. Kopier inn dette (oppdater namespace til ditt eget):


using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Automation.Peers;
using System.Windows.Automation.Provider;

namespace SilverlightDemo
{
public static class DefaultButtonService
{
public static readonly DependencyProperty DefaultButtonProperty =
DependencyProperty.RegisterAttached("DefaultButton", typeof(string), typeof(DefaultButtonService), new PropertyMetadata(OnDefaultButtonChanged));

public static string GetDefaultButton(DependencyObject d)
{
return (string)d.GetValue(DefaultButtonProperty);
}

///
/// Sets the CommandParameter property.
///

public static void SetDefaultButton(DependencyObject d, string value)
{
d.SetValue(DefaultButtonProperty, value);
}

private static void OnDefaultButtonChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBox tb = d as TextBox;
if (tb != null)
{
tb.KeyUp += new KeyEventHandler(tb_KeyUp);
}
}

static void tb_KeyUp(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.Enter:
string name = (string)((DependencyObject)sender).GetValue(DefaultButtonProperty);
object root = App.Current.RootVisual;
object button = ((FrameworkElement)root).FindName(name);
if (button is Button)
{
ButtonAutomationPeer peer = new ButtonAutomationPeer((Button)button);

IInvokeProvider ip = (IInvokeProvider)peer;
ip.Invoke();
}
break;
}
}
}
}

3. Legg til et xmlns i XAML:

xmlns:my="clr-namespace:SilverlightDemo"

4. Legg til en attributt på alle controls som skal trigge at knappen "btnDemo" skal trykkes, for eksempel en textbox:

29Jun/101

DefaultButton i ASP.NET

Posted by Stian

EnterbuttonForskjellige nettlesere behandler et enter-trykk på forskjellige måter avhengig av antall tekstbokser og antall knapper på siden. Dette gjør at vi må styre hvilke knapp som skal behandle et enter-trykk i web applikasjonen. Løsninger som å disable enter knappen med et javascript kan få uheldige konsekvenser som f.eks i en Text Area komponent hvor linjeskift ikke vil virke lenger.

Løsning du vil bruke i de fleste tilfellene er:
<form id="form1" runat="server" defaultbutton="btn1">

Problemet med denne løsningen kom jeg akkurat over i et prosjekt hvor det som så mange andre plasser brukes Masterpages. Vi står derfor uten en form-tag i undersiden og vi må i stedet bruke Panel på denne måten:
<asp:Panel ID="pnl1" runat="server" defaultbutton="Button1">

På denne måten kan du styre flere områder på websiden til å trigge forskjellige Buttons ved enter-trykk.