asp.net - net - html hiddenfor razor
Obtener valor de campo oculto (6)
Tengo un GridView
definido de la siguiente manera:
<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 Editar, necesito obtener el valor de la columna BirthDate
de BirthDate
. Para intentar 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?
Consulte el siguiente artículo que muestra cómo acceder a las columnas invisibles de GridView:
http://www.highoncoding.com/Articles/178_Access_GridView_Invisible_Columns.aspx
La idea es básicamente utilizar una columna TemplateField en lugar de una BoundColumn.
El problema es que cuando la propiedad Visibilidad de BoundField
se establece en falsa, la columna no se representa en el cliente. Un trabajo HiddenField
sería usar un HiddenField
dentro de un TemplateField
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 aún representa la columna en la tabla, por lo que termina 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 así obtener su valor en el controlador de evento 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);
}
He hecho algo como esto (adaptándome a tu ejemplo):
string[] keyList = new string[1];
keyList[0] = "BirthDate";
myGridView.DataKeyNames = keyList;
Luego vinculé 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, haría 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];
}
Sin embargo, me doy cuenta de que esto no involucra campos ocultos.
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>
Usaría la sugerencia de campo oculto que Phaedrus sugirió, y luego en tu código; usa algo como esto:
GridViewRow row = gvUsers.Rows[e.NewEditIndex];
var hfBirthDate = (HiddenField)row.FindControl("hfBirthDate");
DateTime birthDate = DateTime.Parse(hfBirthDate.Value);
esta es una forma de obtener datos de 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"));
}