Q:

Is it possible to add multiple event handlers to ServerClick in an .aspx page?

I have an aspx page with two custom buttons that looks like this:
<cfw:Button runat="server" OnServerClick="CreateProduct" name="Create product" />
<cfw:Button runat="server" OnServerClick="OrderProduct" name="Order product" />

I want 1 button that creates and orders the product at the same time. So I basically want to ask can I add multiple event handlers in the .aspx to the same event?
The button event itself supports this and it is programatically possible:
    public event ProcessEventHandler ServerClick
    {
        add
        {
            Events.AddHandler(serverClick, value);
            PostBack = true;
        }
        remove { Events.RemoveHandler(serverClick, value); }
    }

Rules of the game (because of internal / company standards):

I can't use stuff like <% %>
I'm not allowed to add Code Behind / Code beside to the page
I might need to be able to add 4 event handlers, so don't come with solutions like SecondOnServerClick (I will vote you down ;-) )

I'm looking forward to your input!

A:

Well here is my solution: Based on your constraints, it seems the only possibility is to either (a) inherit your custom framework button and create a subclass, or (b) modify the existing framework button. 
Here is an implementation which works well ( I tested it :) ) by subclassing the System.Web.UI.WebControls.Button class, and test page:
using System.Web.UI.WebControls;
namespace StackOverflowWeb
{
    public class MultiCastButton : Button
    {
        public ListItemCollection ClickEventList { get; set; }

        private void SetEventHandlers()
        {
            // convert listitem values to EventHandler type
            Func<ListItem, EventHandler> getEventHandler = ev =>
                EventHandler.CreateDelegate(
                    typeof(EventHandler), this.Page, ev.Value) as EventHandler;

            if (ClickEventList != null && ClickEventList.Count > 0)
            {
                for (var i = 0; i < ClickEventList.Count; i++)
                { 
                    this.Click += getEventHandler(ClickEventList[i]);
                }
            }
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            // must occur OnInit because 'this.Page' 
            // is null prior to this event firing
            SetEventHandlers();        
       }
    }
}

Then, you have the test page (codebehind) - I know you said you don't have codebehind, so these event handlers can live in any class or class library, and you can register that class on the front of the page. This solution works in an isolated test environment (i.e., new ASP.net web project).
You might have to modify the code in the getEventHandler() method, instead of the target type being this.Page, you may use whatever type contains your actual event handler voids.
public partial class _Default : System.Web.UI.Page
{
    public void Test_Click(object sender, EventArgs args) 
    { 
        ResultPanel.Controls.Add(new Label() { Text = "Test Click Executed" }); 
    }
    public void Test_Click2(object sender, EventArgs args) 
    { 
        ResultPanel.Controls.Add(new Label() { Text = "Test Click 2 Executed" }); 
    }
    public void Test_Click3(object sender, EventArgs args) 
    { 
        ResultPanel.Controls.Add(new Label() { Text = "Test Click 3 Executed" }); 
    }
    public void Test_Click4(object sender, EventArgs args) 
    { 
        ResultPanel.Controls.Add(new Label() { Text = "Test Click 4 Executed" }); 
    }
}

And finally your declaration on the front
<%@ Register Namespace="StackOverflowWeb" TagPrefix="sow" Assembly="StackOverflowWeb" %>
<style> span { display: block; }</style>

<sow:MultiCastButton runat="server" ID="TestClickMultiCastButton" >
    <ClickEventList>
        <asp:ListItem>Test_Click</asp:ListItem>
        <asp:ListItem>Test_Click2</asp:ListItem>
        <asp:ListItem>Test_Click3</asp:ListItem>
        <asp:ListItem>Test_Click4</asp:ListItem>
    </ClickEventList>
</sow:MultiCastButton>

<asp:Panel runat="server" ID="ResultPanel" />

Note that I am using ListItem and a ListItemCollection because it lends itself most easily to being declared in the UI of an ASP.net web forms application.
I hope you find this useful! It is my first answer here on StackOverflow, although I have been an avid reader for a long time.

