Como faço para programaticamente adicionar um botão para um gridview e atribuí-la a uma função específica code-behind?

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

Pergunta

Em tempo de execução Estou criando um DataTable e usando aninhados para-loops para preencher a tabela. Esta tabela I depois atribuir como fonte de dados para um gridview e sobre RowDataBound I atribuir o valor de cada célula. Eu quero saber como eu posso dar a cada célula um botão e atribuir esse botão para uma função codebehind. Vou ter 12 botões e cada um irá conter um valor diferente. Eu preferiria se tudo chamar a mesma função com algum tipo de evento que armazena o valor específico para a célula.

Este é o código onde a tabela é criado:

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

    }
}

Eu gostaria de lidar com a ButtonClick com algo parecido com isto:

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

Todas as sugestões?

Foi útil?

Solução

Em seu gridview na marcação, atribua atributo CommandArgument para o que você quer (aqui eu escolher o índice do GridViewRow atual) dentro dos seus botões.

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

Ou no seu atrás de código, você pode criar um botão como abaixo

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

em seguida, fazer um manipulador de eventos como abaixo

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
     }
   }
}

Outras dicas

Infelizmente nessa fase você não pode criar um novo botão e eventos atribuir a ele. Por este ponto no ciclo de vida da página, quando está disparando eventos, ele já construiu-se a sua lista de controles de "conhecidos" que vai manter o controle de quando recarrega a página, e assim ele não saberá para disparar o seu código de evento Click botão na próxima vez que ele envia de volta.

A fim de obter ASP.NET para disparar corretamente seus métodos de eventos, você precisa adicionar o controle Button para hierarquia de controle da página antes de evento Load da página. Eu costumo fazê-lo no evento ou CreateChildControls método Init.

Para resolver o problema, eu recomendaria adicionar o botão para todas as células na marcação de modelo e tê-lo referência ao manipulador de eventos lá. Então, tem o seu método RowDataBound alça inverter a visibilidade do botão ligado ou desligado.

A maneira mais fácil de fazer isso é simplesmente adicionar uma coluna para o GridView (Você pode usar um botão em vez de um hiperlink, se quiser):

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top