c# - obtener - ocultar columna gridview en tiempo de ejecucion
¿Cómo ocultar una columna(GridView) pero aún acceder a su valor? (13)
Tengo un GridView con un DataSource
(base de datos SQL). Quiero ocultar una columna, pero aún así poder acceder al valor cuando selecciono el registro. ¿Puede alguien mostrarme cómo hacer esto?
Esta es la columna que quiero ocultar y aún quiero acceder a su valor:
<asp:BoundField DataField="Outlook_ID" HeaderText="OutlookID" />
Intenté todo para ocultar la columna (propiedad Visible="false"
), pero no puedo acceder a su valor.
Aquí se muestra cómo obtener el valor de una columna oculta en un GridView
que se establece en Visible=False
: agregue el campo de datos en este caso SpecialInstructions
a la propiedad DataKeyNames del GridView encuadernado, y acceda de esta manera.
txtSpcInst.Text = GridView2.DataKeys(GridView2.SelectedIndex).Values("SpecialInstructions")
Eso es todo, funciona todo el tiempo muy simple.
Cuando quiero acceder a algún valor de GridView
antes de que aparezca GridView
.
- Tengo un
BoundField
y unirDataField
nomalmente. - En el evento
RowDataBound
, realizo algún proceso en ese evento. Antes de que apareciera
GridView
escribo esto:protected void GridviewLecturer_PreRender(object sender, EventArgs e) { GridviewLecturer.Columns[0].Visible = false; }
Definir un estilo en css:
.hiddencol { display: none; }
A continuación, agregue el ItemStyle-CssClass="hiddencol"
y el HeaderStyle-CssClass="hiddencol"
al campo de la cuadrícula:
<asp:BoundField DataField="ID" HeaderText="ID" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" ClientIDMode="Static" />
Deje columnas visibles antes de llenar GridView
. Complete el GridView
y luego oculte las columnas.
Puede hacer que la columna esté hidden
en el lado del servidor y, por alguna razón, esto es diferente a hacerlo con el código aspx
. Todavía se puede hacer referencia como si fuera visible. Simplemente agregue este código a su evento OnDataBound
.
protected void gvSearchResults_DataBound(object sender, EventArgs e)
{
GridView gridView = (GridView)sender;
if (gridView.HeaderRow != null && gridView.HeaderRow.Cells.Count > 0)
{
gridView.HeaderRow.Cells[UserIdColumnIndex].Visible = false;
}
foreach (GridViewRow row in gvSearchResults.Rows)
{
row.Cells[UserIdColumnIndex].Visible = false;
}
}
Puedes hacerlo código detrás.
Set visible= false
para las columnas después del enlace de datos. Después de eso, nuevamente puede hacer que la visibilidad sea " verdadera " en la función row_selection desde la vista de cuadrícula. ¡ Funcionará!
Puedes hacerlo programáticamente:
grid0.Columns[0].Visible = true;
grid0.DataSource = dt;
grid0.DataBind();
grid0.Columns[0].Visible = false;
De esta forma, configura la columna como visible antes del enlace de datos, por lo que se genera la columna. Establece la columna como no visible, por lo que no se muestra.
Si no me equivoco, GridView
no contiene los valores de BoundColumns
que tienen el atributo visible="false"
. Dos cosas que puede hacer aquí, una (como se explica en la respuesta de V4Vendetta) para utilizar Datakeys
. O puede cambiar su BoundColumn
a TemplateField
. Y en ItemTemplate
, agregue un control como Label
, haga que su visibilidad sea falsa y dé su valor a esa Label
.
Si tiene un TemplateField
dentro de las columnas de su GridView
y tiene, digamos, un control llamado blah vinculado a él. Luego coloque el outlook_id
como un HiddenField
allí así:
<asp:TemplateField HeaderText="OutlookID">
<ItemTemplate>
<asp:Label ID="blah" runat="server">Existing Control</asp:Label>
<asp:HiddenField ID="HiddenOutlookID" runat="server" Value=''<%#Eval("Outlook_ID") %>''/>
</ItemTemplate>
</asp:TemplateField>
Ahora, tome la fila en caso de que quiera el outlook_id
y luego acceda al control.
Para RowDataBound
accede como:
string outlookid = ((HiddenField)e.Row.FindControl("HiddenOutlookID")).Value;
Regrese, si tiene problemas para acceder a la fila cliqueada. Y no olvide mencionar el evento al que desea acceder.
Tengo una nueva solución ocultar la columna en el lado del cliente usando css o javascript o jquery .
.col0
{
display: none;
}
Y establezca gvClientDetails.Columns[0].Visible = true;
, Si configura a false
.
Usé un método similar al user496892:
SPBoundField hiddenField = new SPBoundField();
hiddenField.HeaderText = "Header";
hiddenField.DataField = "DataFieldName";
grid.Columns.Add(hiddenField);
grid.DataSource = myDataSource;
grid.DataBind();
hiddenField.Visible = false;
Puede utilizar DataKeys para recuperar el valor de dichos campos, porque (como dijo) cuando establece un BoundField
normal como visible falso, no puede obtener su valor.
En el archivo .aspx
, establezca la propiedad GridView
DataKeyNames = "Outlook_ID"
Ahora, en un controlador de eventos, puede acceder al valor de esta clave de la siguiente manera:
grid.DataKeys[rowIndex]["Outlook_ID"]
Esto le dará la identificación en el rowindex especificado de la grilla.
<head runat="server">
<title>Accessing GridView Hidden Column value </title>
<style type="text/css">
.hiddencol
{
display: none;
}
</style>
<asp:BoundField HeaderText="Email ID" DataField="EmailId" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" >
</asp:BoundField>
ArrayList EmailList = new ArrayList();
foreach (GridViewRow itemrow in gvEmployeeDetails.Rows)
{
EmailList.Add(itemrow.Cells[YourIndex].Text);
}