content - c#clic en la fila de la grilla
evento cell click datagridview c# (9)
Cuando hago clic en una fila en mi GridView, quiero ir a otra página con la ID que obtengo de la base de datos.
En mi evento RowCreated tengo la siguiente línea:
e.Row.Attributes.Add(
"onClick",
ClientScript.GetPostBackClientHyperlink(
this.grdSearchResults, "Select$" + e.Row.RowIndex));
Para evitar mensajes de error, tengo 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);
}
¿Cómo puedo darle a una fila un ID único (del DB) y cuando hago clic en la fila, se abre otra página (como hacer clic en un href) y esa página puede leer el ID.
¿Puede su identificación estar relacionada con el elemento de datos que se muestra en la vista de cuadrícula?
De ser así, puede usar e.Row.DataItem y convertirlo al tipo que sea.
Tengo la solución.
Esto es lo que hice:
if(e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes["onClick"] = "location.href=''view.aspx?id=" + DataBinder.Eval(e.Row.DataItem, "id") + "''";
}
He puesto el código anterior en el evento RowDataBound.
Puede usar el evento RowCommand de la vista de cuadrícula para este. En su botón / enlace donde desea establecer el clic, establezca CommandName y CommandArgument, que puede acceder en el parámetro EventArgs del método de evento.
hacer clic en fila en la vista de cuadrícula redirigir a otra 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 bien
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 + "''";
}
}
Martijn,
Aquí hay otro ejemplo con algunos nifty row highlighting y un cursor de 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 + "''");
}
}
El código anterior funciona en .NET 3.5. Sin embargo, no puede configurar su columna de Id. En Visible = "falso" porque obtendrá un valor de cadena de consulta en blanco para su clave de 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>
Así que cambie la primera columna a esto en su lugar:
<asp:BoundField DataField="id" ItemStyle-CssClass="hide" />
Agregue este css a la parte superior de su página:
<head>
<style type="text/css">
.hide{
display:none;
}
</style>
<head>
Pero para ocultar la primera celda de la fila de encabezado, agréguela a su gvSearch_RowDataBound () en código subyacente:
if (e.Row.RowType == DataControlRowType.Header)
{
e.Row.Cells[0].CssClass = "hide";
}
Obviamente, también podría haber ocultado la columna id en código subyacente, pero esto generará más texto en su marcado que una clase 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 + "''";
}
}
JohnB, Tu código funciona muy bien, agregué solo un pequeño truco para evitar la alteración de la arruinación de ROWStyle después del mouseout.
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''''");
Cambiado a:
e.Row.Attributes.Add("onmouseout", "if(" + e.Row.RowIndex + "% 2 == 0) { this.style.backgroundColor=''''; } else { this.style.backgroundColor = ''#E8F7EA''; }");
Si hay una mejor manera de hacerlo, hágamelo saber, pero funciona perfecto para mí.
Saludos.
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 + "''");
}
}
}