Cómo recuperar el valor de una columna en GridView

Tengo una tabla con las siguientes columnas:

FileID | username | filename

Estoy usando una vista de cuadrícula que tiene dos columnas:

Nombre de archivo | Descargar

En la columna de descarga, tengo un botón llamado Descargar que se usará para descargar archivos. Ahora quiero recuperar el ID de archivo o el nombre de archivo cuando hago clic en el botón Descargar.

Intenté esta línea para obtener el ID de archivo pero estaba dando un error:

int FileID = (int)GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value;

Error: System.ArgumentOutOfRangeException no fue manejado por el código de usuario Message=Index estaba fuera de rango. Debe ser no negativo y menor que el tamaño de la colección.

Aquí está mi código de página aspx:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="filelist" 
    Width="404px" onrowcommand="GridView1_RowCommand" Height="131px">
    <Columns>
        <asp:BoundField DataField="fileid" HeaderText="fileid" InsertVisible="False" 
            ReadOnly="True" SortExpression="fileid" Visible="False" />
        <asp:BoundField DataField="userid" HeaderText="userid" SortExpression="userid" 
            Visible="False" />
        <asp:BoundField DataField="filename" HeaderText="FileName" 
            SortExpression="filename" />
        <asp:ButtonField HeaderText="Download" Text="Download" CommandName="download"/>
    </Columns>
</asp:GridView>


<asp:SqlDataSource ID="filelist" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
    SelectCommand="SELECT * FROM [FileDetails] WHERE ([userid] = @userid)">
    <SelectParameters>
        <asp:SessionParameter Name="userid" SessionField="userid" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

Hay otra manera de hacer esto?

preguntado el 03 de mayo de 12 a las 15:05

2 Respuestas

Podrías usar tu primera BoundField para obtener el fileid:

GridViewRow row = (GridViewRow)((Control)sender).NamingContainer;
int FileID = int.Parse(row.Cells[0].Text);

Editar: Cuando estás manejando el GridView RowCommand evento, el código anterior no funciona ya que el sender es GridView en lugar de Button. Luego encontrará su Botón en el GridViewCommandEventArgs.CommandSource:

GridViewRow row = (GridViewRow)((Control)e.CommandSource).NamingContainer;
int FileID = int.Parse(row.Cells[0].Text);

contestado el 03 de mayo de 12 a las 16:05

La primera línea da la siguiente excepción: no se puede convertir el objeto de tipo 'System.Web.UI.WebControls.GridView' para escribir 'System.Web.UI.WebControls.GridViewRow'. - v3z3t4

Así es como accedería al valor en una columna dentro de una cuadrícula de datos

GridView1.Rows[rowId].Cells[columnId].Value 

contestado el 03 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.