Domanda
Quando faccio clic su una riga in GridView, voglio passare a un'altra pagina con l'ID che ottengo dal database.
Nel mio evento RowCreated ho la seguente riga:
e.Row.Attributes.Add(
"onClick",
ClientScript.GetPostBackClientHyperlink(
this.grdSearchResults, "Selectprotected override void Render(HtmlTextWriter writer)
{
// .NET will refuse to accept "unknown" postbacks for security reasons.
// Because of this we have to register all possible callbacks
// This must be done in Render, hence the override
for (int i = 0; i < grdSearchResults.Rows.Count; i++)
{
Page.ClientScript.RegisterForEventValidation(
new System.Web.UI.PostBackOptions(
grdSearchResults, "Select<*>quot; + i.ToString()));
}
// Do the standard rendering stuff
base.Render(writer);
}
quot; + e.Row.RowIndex));
Per prevenire i messaggi di errore ho questo codice:
<*>Come posso assegnare a una riga un ID univoco (dal DB) e quando faccio clic sulla riga, viene aperta un'altra pagina (come fare clic su un href) e quella pagina può leggere l'ID.
Soluzione
Ho la soluzione.
Questo è quello che ho fatto:
if(e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes["onClick"] = "location.href='view.aspx?id=" + DataBinder.Eval(e.Row.DataItem, "id") + "'";
}
Ho inserito il codice precedente nell'evento RowDataBound.
Altri suggerimenti
Martijn,
Ecco un altro esempio con l'evidenziazione di una riga elegante e un cursore in stile href:
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#ceedfc'");
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");
e.Row.Attributes.Add("style", "cursor:pointer;");
e.Row.Attributes.Add("onclick", "location='patron_detail.aspx?id=" + e.Row.Cells[0].Text + "'");
}
}
Il codice sopra funziona in .NET 3.5. Tuttavia, non puoi impostare la colonna ID su Visible = " false " perché otterrai un valore di stringa di query vuoto per la tua chiave ID:
<asp:GridView ID="gvSearch" runat="server" OnRowDataBound="gvSearch_RowDataBound" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="id" Visible="false" />
<asp:BoundField DataField="first_name" HeaderText="First" />
<asp:BoundField DataField="last_name" HeaderText="Last" />
<asp:BoundField DataField="email" HeaderText="Email" />
<asp:BoundField DataField="state_name" HeaderText="State" />
</Columns>
</asp:GridView>
Quindi cambia la prima colonna in questa invece:
<asp:BoundField DataField="id" ItemStyle-CssClass="hide" />
Aggiungi questo CSS nella parte superiore della tua pagina:
<head>
<style type="text/css">
.hide{
display:none;
}
</style>
<head>
Ma per nascondere la prima cella della riga di intestazione, aggiungila a gvSearch_RowDataBound () in code-behind:
if (e.Row.RowType == DataControlRowType.Header)
{
e.Row.Cells[0].CssClass = "hide";
}
Ovviamente, potresti aver nascosto la colonna id anche nel code-behind, ma questo comporterà più testo nel markup di una classe css:
e.Row.Cells[0].Attributes.Add("style", "display:none;");
e.Row.Attributes.Add("style", "cursor:pointer;");
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();
e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";
}
}
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();
e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";
}
}
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
GridViewRow gvr = e.Row;
string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();
gvr.Attributes.Add("OnClick", "javascript:location.href='Default.aspx?id=" + abc + "'");
}
}
}
Il tuo ID può essere correlato all'elemento dati visualizzato nella visualizzazione griglia?
In tal caso puoi usare e.Row.DataItem e lanciarlo in qualunque tipo.
È possibile utilizzare l'evento RowCommand della vista griglia per questo. Nel tuo pulsante / collegamento in cui desideri impostare il clic, imposta CommandName e CommandArgument, che puoi accedere al parametro EventArgs del metodo dell'evento.
il clic della riga nella vista griglia reindirizza a un'altra pagina funziona perfettamente
JohnB, Il tuo codice funziona molto bene, ho aggiunto solo un piccolo trucco per evitare di alterare Rovina rovina dopo il passaggio del mouse.
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");
Modificato in:
e.Row.Attributes.Add("onmouseout", "if(" + e.Row.RowIndex + "% 2 == 0) { this.style.backgroundColor=''; } else { this.style.backgroundColor = '#E8F7EA'; }");
Se c'è un modo migliore per farlo, per favore fatemi sapere, ma funziona perfettamente per me.
Saluti.