2009-12-02 27 views
5

Tengo un GridView definido de la siguiente manera:Obtener valor de campo oculto

<asp:GridView ID="myGridView" AutoGenerateColumns="false" runat="server" 
OnLoad="myGridView_Load" OnRowCommand="myGridView_Command" OnRowEditing="myGridView_RowEditing" OnRowDeleting="myGridView_RowDeleting" DataKeyNames="ID" > 
    <Columns> 
    <asp:BoundField DataField="ID" Visible="false" /> 
    <asp:BoundField DataField="BirthDate" Visible="false" /> 
    <asp:BoundField DataField="FirstName" HeaderText="First Name" /> 
    <asp:BoundField DataField="LastName" HeaderText="Last Name" /> 
    <asp:TemplateField HeaderText="Other"> 
     <ItemTemplate> 
     <asp:LinkButton ID="editLB" runat="server" Text="edit" CommandName="Edit" /> 
     <asp:LinkButton ID="deleteLB" runat="server" Text="delete" CommandName="Delete" /> 
     </ItemTemplate> 
    </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Cuando un usuario hace clic en el botón de edición, lo que necesito para obtener el valor de la columna de BirthDate. Para tratar esto, he intentado lo siguiente:

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = gvUsers.Rows[e.NewEditIndex]; 
    DateTime birthDate = (DateTime)(row.Cells[1].Text); 

    // Does not work 
} 

sé que tiene algo que ver con el hecho de que la columna no es visible. La columna debe estar oculta. Pero necesito obtener ese valor — ¿cómo puedo hacer esto?

Respuesta

9

El problema es que cuando la propiedad Visibilidad del BoundField se establece en falso, la columna no se representa en el cliente. Una alternativa sería usar un HiddenField dentro de un TemplateField en su lugar.

<asp:TemplateField> 
    <ItemTemplate> 
     <asp:HiddenField ID="HiddenField1" runat="server" 
         Value='<%# Eval("BirthDate") %>' /> 
    </ItemTemplate> 
    <EditItemTemplate> 
     <asp:HiddenField ID="HiddenField1" runat="server" 
         Value='<%# Eval("BirthDate") %>' /> 
    </EditItemTemplate> 
</asp:TemplateField> 
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = GridView.Rows[e.NewEditIndex];  
    HiddenField hidden = (HiddenField)row.Cells[0].FindControl("HiddenField1"); 
    DateTime birthDate = Convert.ToDateTime(hidden.Value); 
} 

EDITAR

El método anterior todavía hace que la columna de la tabla, por lo que terminan con una columna vacía. Funciona, pero no es la mejor solución, aquí hay una manera de ocultar el campo BirthDate pero aún obtener su valor en el controlador de eventos RowEditing. Solo tenga en cuenta que BirthDate todavía se procesa para el cliente, simplemente no se muestra.

<style type="text/css"> 
    .hide 
    { 
     display:none; 
    } 
</style> 

<asp:BoundField DataField="BirthDate"> 
    <ItemStyle CssClass="hide"/> 
</asp:BoundField> 
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = GridView1.Rows[e.NewEditIndex]; 
    DateTime birthDate = Convert.ToDateTime(row.Cells[1].Text); 
} 
+0

me trataron segundo pero hided todavía existen pocos valores y cabecera. ¿Cómo puedo ocultar también el encabezado? (No puedo usar visible = falso porque denego sus datos) – Rapunzo

+0

configuro la clase css del encabezado para ocultar – MattBH

0

esta es una manera de obtener datos de los datos subyacentes

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = gvUsers.Rows[e.NewEditIndex]; 
DateTime birthDate = Convert.ToDateTime(DataBinder.Eval(row.DataItem, "BirthDate")); 
} 
+0

No creo que DataItem esté fuera del contexto de enlace de datos. Dentro del controlador de eventos RowEditing, DataItem será nulo. – Phaedrus

2

que he hecho algo como esto (adaptación a su ejemplo):

string[] keyList = new string[1]; 
keyList[0] = "BirthDate"; 
myGridView.DataKeyNames = keyList; 

entonces atado el GridView con una DataTable que tiene una columna llamada "BirthDate". Los datos en esta columna se almacenarán bajo DataKeyName especificado anteriormente.

Para obtener el valor deseado, me gustaría hacer algo como esto:

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    DataKeyArray keyList = myGridView.DataKeys as DataKeyArray; 
    if (keyList != null)  
    DateTime birthDate = keyList[e.NewEditIndex];  
} 

que dan cuenta de que no se recurra a los campos ocultos, sin embargo.

+1

La propiedad DataKeyNames se usa para identificar de forma única cada fila, se debe usar para las claves principales. – Phaedrus

+0

Excelente punto. Cuando utilicé DataKeyNames, eso es exactamente para lo que los utilicé. –

0

Usaría la sugerencia de campo oculto que sugería Phaedrus, y luego en su código; usar algo como esto:

GridViewRow row = gvUsers.Rows[e.NewEditIndex]; 
var hfBirthDate = (HiddenField)row.FindControl("hfBirthDate"); 
DateTime birthDate = DateTime.Parse(hfBirthDate.Value); 
5

Para ocultar el contenido y el encabezado en la cuadrícula, use el siguiente código: y acceda a la columna como de costumbre.GridView.SelectedRow.Cells[index].Text;

<style type="text/css"> 
.hide 
{ 
    display:none; 
} 

<asp:BoundField DataField="MailRoomID" HeaderText="Mailroom ID" ItemStyle-HorizontalAlign="Center" ShowHeader="false" ><ItemStyle CssClass="hide" /><HeaderStyle CssClass="hide"/></asp:BoundField>