Pregunta

Tengo GridView que puedo seleccionar una fila. Luego tengo un botón encima de la cuadrícula llamado Editar en el que el usuario puede hacer clic para abrir una ventana y editar la fila seleccionada. Por lo tanto, el botón tendrá un código Javascript detrás de él a lo largo de las líneas de

function editRecord()
{
  var gridView = document.getElementById("<%= GridView.ClientID %>");
  var id = // somehow get the id here ???
  window.open("edit.aspx?id=" + id);
}

La pregunta es ¿cómo recupero el ID de los registros seleccionados en javascript?

¿Fue útil?

Solución

Lo resolví en base a la respuesta de JasonS. Lo que hice fue crear un campo oculto en la Vista de cuadrícula como este:

<asp:TemplateField ShowHeader="False">
    <ItemTemplate>
      <asp:HiddenField ID="hdID" runat="server" Value='<%# Eval("JobID") %>' />
    </ItemTemplate>
</asp:TemplateField>
<asp:TemplateField Visible="False">
    <ItemTemplate>
      <asp:LinkButton ID="lnkSelect" runat="server" CommandName="select" Text="Select" />
    </ItemTemplate>
</asp:TemplateField>

Luego, en OnRowDataBind, tiene un código para configurar la fila seleccionada

protected virtual void Grid_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Click to highlight row
        Control lnkSelect = e.Row.FindControl("lnkSelect");
        if (lnkSelect != null)
        {
            StringBuilder click = new StringBuilder();
            click.AppendLine(m_View.Page.ClientScript.GetPostBackClientHyperlink(lnkSelect, String.Empty));
            click.AppendLine(String.Format("onGridViewRowSelected('{0}')", e.Row.RowIndex));
            e.Row.Attributes.Add("onclick", click.ToString());
        }
    }            
}

Y luego en el Javascript tengo un código como este

<script type="text/javascript">

var selectedRowIndex = null;

function onGridViewRowSelected(rowIndex)
{        
    selectedRowIndex = rowIndex;
}

function editItem()
{   
    if (selectedRowIndex == null) return;

    var gridView = document.getElementById('<%= GridView1.ClientID %>');                
    var cell = gridView.rows[parseInt(selectedRowIndex)+1].cells[0];        
    var hidID = cell.childNodes[0];        
    window.open('JobTypeEdit.aspx?id=' + hidID.value);
}

</script> 

Funciona a tratar :-)

Otros consejos

1) cambia tu función javascript para usar un parámetro

function editRecord(clientId)
{ ....

2) genere la llamada en su botón editRecord ... si desea evitar tratar con las identificaciones generadas en .net, solo use una simple

<input type="button" onclick="editRecord(your-rows-client-id-goes-here)" />

Basado en sus comentarios a la respuesta de @DaveK, en javascript puede establecer la identificación de un campo oculto en el ID de cliente de la fila seleccionada cuando el usuario lo seleccione. Luego haga que su función editRecord use el valor establecido en el campo de formulario oculto.

uno podría evitar el javascript por completo, estableciendo etiquetas de anclaje rellenadas previamente con la cadena de consulta para cada fila (aunque esto afectará su diseño de tabla, solo necesitará un clic en lugar de 2 del usuario)

inserte en la plantilla de gridview:

<asp:HyperLink runat="server" ID="editLink" Target="_blank"
   NavigateURL='<%# Eval("JobID","edit.aspx?id={0}") %>'> 
     Edit..
</asp:HyperLink>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top