Come faccio a livello di codice aggiungere un pulsante a una GridView e assegnarlo a una funzione specifica code-behind?

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

Domanda

In runtime Sto creando un DataTable e utilizzando nidificato per-loop per compilare la tabella. Questa tabella I in seguito assegnare come DataSource a un gridview e RowDataBound assegno il valore di ciascuna cella. Vorrei sapere come posso dare ogni cella un pulsante e assegnare tale pulsante per la funzione codebehind. Avrò 12 pulsanti e ognuno conterrà un valore diverso. Io preferirei se tutti chiamano la stessa funzione con un certo tipo di evento che memorizza il valore specifico delle cellule.

Questo è il codice in cui viene creata la tabella:

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

    }
}

Vorrei gestire la ButtonClick con qualcosa di simile:

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

Qualche suggerimento?

È stato utile?

Soluzione

Il tuo GridView nel markup, assegnare l'attributo CommandArgument a seconda di quale si desidera (qui ho scelto l'indice della GridViewRow corrente) all'interno dei tuoi pulsanti.

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

o nel codice dietro, è possibile creare un pulsante mi piace di sotto

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

poi fare un gestore di eventi come la seguente

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

Altri suggerimenti

Purtroppo in questa fase non è possibile creare un nuovo pulsante e assegnare gli eventi ad esso. Con questo punto del ciclo di vita pagina, quando è sparare eventi, si è già costruito è di elenco di "noti" controlli che non mancherà di tenere traccia di quando la pagina viene ricaricata, e quindi non si sa a fuoco il codice evento click pulsante la prossima volta che il postback.

Al fine di ottenere ASP.NET al fuoco correttamente i metodi di eventi, è necessario aggiungere il controllo Button alla gerarchia di controllo della pagina prima dell'evento Load della pagina. Io di solito faccio nel metodo Init o CreateChildControls.

Per risolvere il problema, mi sento di raccomandare di aggiungere il pulsante per tutte le cellule nel codice modello e l'abbiano in riferimento al gestore di eventi lì. Quindi, avere il vostro metodo di RowDataBound gestire capovolgere la visibilità del pulsante acceso o spento.

Il modo più semplice per farlo è sufficiente aggiungere una colonna al tuo GridView (È possibile utilizzare un pulsante, piuttosto che un collegamento ipertestuale se vi piace):

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top