Pergunta
Quando clico em uma linha no meu GridView, eu quero ir para uma outra página com a ID que eu começar a partir do banco de dados.
Na minha evento RowCreated Eu tenho a seguinte linha:
e.Row.Attributes.Add(
"onClick",
ClientScript.GetPostBackClientHyperlink(
this.grdSearchResults, "Select$" + e.Row.RowIndex));
Para evitar mensagens de erro que eu tenho este código:
protected 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$" + i.ToString()));
}
// Do the standard rendering stuff
base.Render(writer);
}
Como posso dar uma fileira uma identificação única (a partir do DB) e quando eu clique na linha, uma outra página é aberta (como clicar em um href) e que a página pode ler a ID.
Solução
Eu tenho a solução.
Isto é o que eu fiz:
if(e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes["onClick"] = "location.href='view.aspx?id=" + DataBinder.Eval(e.Row.DataItem, "id") + "'";
}
Eu putted o código anterior no caso RowDataBound.
Outras dicas
Martijn,
Aqui está outro exemplo com algum destaque fileira bacana e um cursor estilo 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 + "'");
}
}
O código acima funciona em .NET 3.5. No entanto, você não pode definir a sua coluna id to = Visíveis "false", porque você vai ter um valor de string de consulta em branco para a sua chave 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>
Assim, mudar a primeira coluna para este em vez disso:
<asp:BoundField DataField="id" ItemStyle-CssClass="hide" />
Adicione esta css para o topo da sua página:
<head>
<style type="text/css">
.hide{
display:none;
}
</style>
<head>
Mas a esconder a primeira célula da sua linha de cabeçalho, adicione isso ao seu gvSearch_RowDataBound () em código-behind:
if (e.Row.RowType == DataControlRowType.Header)
{
e.Row.Cells[0].CssClass = "hide";
}
Obviamente, você poderia ter escondido a coluna id no código-behind também, mas isso vai resultar em mais texto na sua marcação de uma 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 + "'");
}
}
}
Pode o seu ID estar relacionado com o item de dados exibidos na gridview?
Se assim você pode usar e.Row.DataItem, e lançá-lo para qualquer tipo que seja.
Você pode usar o evento RowCommand da exibição de grade para ele. Em seu botão / link onde você wnat para definir o clique, defina o CommandName e CommandArgument, que você pode accees no EventArgs paramter do método de evento.
linha clique na exibição de grade redirecionamento para outra página
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 + "'";
}
}
funciona absolutamente bem
JohnB, Seu código funciona muito bem, eu adicionei um pouco hack para AlternatingRowStyle evitar estragar após mouseout.
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");
alterado para:
e.Row.Attributes.Add("onmouseout", "if(" + e.Row.RowIndex + "% 2 == 0) { this.style.backgroundColor=''; } else { this.style.backgroundColor = '#E8F7EA'; }");
Se há uma maneira melhor de fazê-lo, por favor, avise-me, mas é perfeito trabalhando para mim.
Saudações.