Wie füge ich einer Rasteransicht programmgesteuert eine Schaltfläche hinzu und ordne sie einer bestimmten CodeBehind-Funktion zu?

Zur Laufzeit erstelle ich eine DataTable und benutze verschachtelte for-Schleifen, um die Tabelle zu füllen. Diese Tabelle ordne ich später als DataSource einer Rasteransicht zu und ordne in RowDataBound den Wert jeder Zelle zu. Ich möchte wissen, wie ich jeder Zelle einen Knopf geben und diesen Knopf einer Codebehind-Funktion zuweisen kann. Ich habe 12 Schaltflächen und jede enthält einen anderen Wert. Ich würde es vorziehen, wenn alle dieselbe Funktion mit einer Art Ereignis aufrufen, das den zellenspezifischen Wert speichert.

Dies ist der Code, in dem die Tabelle erstellt wird:

protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e)
{


    DataTable diceTable = _gm.GetDice(_gameId);
    for (int i = 0; i < GameRules.ColumnsOfDice; i++)
    {
        if(e.Row.RowIndex > -1)
        {
            /*This is where I'd like to add the button*/
            //e.Row.Cells[i].Controls.Add(new Button);
            //e.Row.Cells[i].Controls[0].Text = specific value from below

            //This is where the specific value gets input
            e.Row.Cells[i].Text = diceTable.Rows[e.Row.RowIndex][i].ToString();
        }

    }
}

Ich würde gerne mit dem Buttonclick so etwas anfangen:

protected void DiceButton_Click(int column, int row, int value)
{
    //Do whatever
}

Irgendwelche Vorschläge?