¿Cómo puedo añadir un botón mediante programación a un gridview y asignarlo a una función específica de código subyacente?

StackOverflow https://stackoverflow.com/questions/2418379

Pregunta

En tiempo de ejecución que estoy creando un DataTable y el uso anidado de bucles para rellenar la tabla. Esta tabla I más adelante asignar como fuente de datos a un gridview y en RowDataBound que asignar el valor de cada celda. Quiero saber cómo puedo dar a cada célula de un botón y asignar ese botón para una función de código subyacente. Voy a tener 12 botones y cada uno contendrá un valor diferente. Yo preferiría si todos ellos llaman la misma función con algún tipo de evento que almacena el valor específico de la célula.

Este es el código en la tabla se crea:

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();
        }

    }
}

Me gustaría manejar la ButtonClick con algo como esto:

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

¿Alguna sugerencia?

¿Fue útil?

Solución

En el gridview en el marcado, asignar CommandArgument atribuyen a lo que desea (en este caso elijo el índice de la gridviewrow actual) en el interior de los botones.

 <asp:Button ID="lbnView" runat="server" Text="Button" OnClick="btn_Clicked" 
CommandArgument="<%# ((GridViewRow)Container).RowIndex %>"></asp:Button>

O en su código detrás, puede crear un botón de abajo

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) 
        { 
            Button btn = new Button();
            btn.CommandArgument = diceTable.Rows[e.Row.RowIndex][i].ToString(); 
            btn.Attributes.Add("OnClick", "btn_Clicked");

            e.Row.Cells[i].Controls.Add(btn);
        }
    }
}

a continuación, hacer un controlador de eventos, como a continuación

protected void btn_Clicked(object sender, EventAgrs e)
{
   //get your command argument from the button here
   if (sender is Button)
   {
     try
     {
        String yourAssignedValue = ((Button)sender).CommandArgument;
     }
     catch
     {
       //Check for exception
     }
   }
}

Otros consejos

Por desgracia, en esta etapa no se puede crear un nuevo botón y asignar eventos a la misma. En este punto de la página de ciclo de vida, cuando se está disparando eventos, ya ha acumulado es de lista de controles "conocidos" que mantendrá un registro de cuando la página se recarga, por lo que no sabrá que tiene que despedir a su botón de código de evento Click la próxima vez que publica la espalda.

Con el fin de conseguir ASP.NET para disparar correctamente sus métodos de evento, es necesario agregar el control Button a la jerarquía de control de la página antes de evento de carga de la página. Usualmente lo hago en el método de evento de inicialización o CreateChildControls.

Para resolver el problema, yo recomendaría añadir el botón a todas las células en el formato de plantilla y haga que la referencia al controlador de eventos allí. A continuación, que su método de RowDataBound manejar la visibilidad de voltear el botón de encendido o apagado.

La forma más sencilla de hacer esto es simplemente agregar una columna a la GridView (Puede utilizar un botón en lugar de un hipervínculo si se quiere):

<Columns>
 <asp:HyperLinkField DataNavigateUrlFields="ID" DataNavigateUrlFormatString="~/pUser.aspx?field={0}" HeaderText="Select" Text="Select" />

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top