CommandName y CommandArgument

El CommandName y el CommandArgument son dos de las propiedades más útiles pero menos utilizadas de ASP.NET. La razón de ser tan poco utilizadas es que una vez adquirido el conocimiento mínimo sobre manejo de botones y similares, las funcionalidades del CommandName y del CommandArgument pueden emularse con complicadas, pero funcionales, argucias.

Sin embargo, el uso del CommandName y de CommandArgument es increíblemente sencillo, y sus aplicaciones son muy poderosas.

En este artículo vamos a poner siempre como ejemplo al Button, aunque es exactamente igual para otros controles como el LinkButton, pero básicamente, con el CommandName y el CommandArgument lo que podemos hacer es asignar el mismo evento onclick a varios botones y realizar una acción diferente según el CommandName y el CommandArgument de la fuente responsable de ese click.

Sí, ya sé, un ejemplo vale más que mil palabras, así que:

CommandName_CommandArgument.aspx
            <asp:Button ID="Button1" runat="server" Text="Botón 1" OnClick="myButton_Click" CommandName="NumeroDeBoton" CommandArgument="1" />
        <br />
        <asp:Button ID="Button2" runat="server" Text="Botón 2" OnClick="myButton_Click" CommandName="NumeroDeBoton" CommandArgument="2" />
        <br />
        <asp:Button ID="Button3" runat="server" Text="Botón resumen" OnClick="myButton_Click" CommandName="Resumen" />
        <br />
        <br />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>



CommandName_CommandArgument.aspx.cs
    protected void myButton_Click(object sender, EventArgs e)
    {
        Button boton = (Button)sender;

        switch (boton.CommandName)
        {
            case "NumeroDeBoton":
                Label1.Text = "Has presionado el botón número " + boton.CommandArgument;
                break;
            case "Resumen":
                Label1.Text = "Has presionado sobre el botón de resumen";
                break;
        }
    }


Como veis, tenemos 3 botones con el mismo evento onclick: myButton_Click.
La diferencia entre los tres botones es que dos de ellos tienen el mismo CommandName (NumeroDeBoton) y diferentes CommandArgument, mientras que el otro tiene directamente otro CommandName (Resumen).

De modo que en nuestro CodeBehind, realizamos acciones diferentes según las variables del botón desde el que viene el clic.

Lo primero que hacemos es recoger el botón mediante:

    Button boton = (Button)sender;

Y mediante el switch hacemos distinción del CommandName. Y dentro de cada caso, usamos el CommandArgument (en caso de ser necesario) para sacar por pantalla un mensaje personalizado.

El ejemplo es muy sencillo, pero las aplicaciones posibles son enormes y sólo vosotros y vuestros trabajos decidirán cuando se puede aplicar eficientemente el CommandName y el CommandArgument.