Come faccio a livello di codice aggiungere un pulsante a una GridView e assegnarlo a una funzione specifica code-behind?
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?
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" />