c# - its - GridView Ocultar columna por código
ocultar columna datagridview c# (13)
Algunas de las respuestas que he visto explican cómo hacer que los contenidos de una celda sean invisibles, pero no cómo ocultar toda la columna, que es lo que quería hacer.
Si tiene AutoGenerateColumns = "false"
y está usando BoundField
para la columna que desea ocultar, la answer de Bala es astuta. Pero si está utilizando TemplateField
para la columna, puede manejar el evento DataBound
y hacer algo como esto:
protected void gridView_DataBound(object sender, EventArgs e)
{
const int countriesColumnIndex = 4;
if (someCondition == true)
{
// Hide the Countries column
this.gridView.Columns[countriesColumnIndex].Visible = false;
}
}
Puede que esto no sea lo que el OP estaba buscando, pero es la solución que estaba buscando cuando me hice la misma pregunta.
Quiero ocultar la columna ID en mi GridView, sabía el código
GridView1.Columns[0].Visible = false;
¡pero la sorpresa fue que mi propiedad de conteo para mis columnas GridView
es 0! mientras que puedo ver datos en GridView
, entonces ¿alguna idea?
Gracias,
Actualizar:
aquí está el código completo para el método que puebla el GridView
public DataSet GetAllPatients()
{
SqlConnection connection = new SqlConnection(this.ConnectionString);
String sql = "SELECT [ID],[Name],[Age],[Phone],[MedicalHistory],[Medication],[Diagnoses] FROM [dbo].[AwadyClinc_PatientTbl]order by ID desc";
SqlCommand command = new SqlCommand(sql, connection);
SqlDataAdapter da = new SqlDataAdapter(command);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
Aquí estoy vinculando la vista de cuadrícula con un conjunto de datos como este-
GVAnswer.DataSource = DS.Tables[0];
GVAnswer.DataBind();
A continuación, después
Luego contamos el número de filas como esta en el ciclo for
for (int i = 0; i < GVAnswer.Rows.Count; i++)
{
}
Luego, cuando encontremos el encabezado, queremos que sea visible.
GVAnswer.HeaderRow.Cells[2].Visible = false;
luego, después hacemos que la visibilidad sea falsa de esa celda en particular.
El código completo es give like this
public void FillGVAnswer(int QuestionID)
{
try
{
OBJClsQuestionAnswer = new ClsQuestionAnswer();
DS = new DataSet();
DS = OBJClsQuestionAnswer.GetAnswers(QuestionID);
GVAnswer.DataSource = DS.Tables[0];
GVAnswer.DataBind();
if (DS.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < GVAnswer.Rows.Count; i++)
{
GVAnswer.HeaderRow.Cells[2].Visible = false;
GVAnswer.HeaderRow.Cells[3].Visible = false;
GVAnswer.HeaderRow.Cells[6].Visible = false;
GVAnswer.HeaderRow.Cells[8].Visible = false;
GVAnswer.HeaderRow.Cells[10].Visible = false;
GVAnswer.HeaderRow.Cells[11].Visible = false;
//GVAnswer.Rows[i].Cells[1].Visible = false;
if (GVAnswer.Rows[i].Cells[4].Text == "T")
{
GVAnswer.Rows[i].Cells[4].Text = "Text";
}
else
{
GVAnswer.Rows[i].Cells[4].Text = "Image";
}
if (GVAnswer.Rows[i].Cells[5].Text == "View Image")
{
HtmlAnchor a = new HtmlAnchor();
a.HRef = "~/ImageHandler.aspx?ACT=AIMG&AID=" + GVAnswer.Rows[i].Cells[2].Text;
a.Attributes.Add("rel", "lightbox");
a.InnerText = GVAnswer.Rows[i].Cells[5].Text;
GVAnswer.Rows[i].Cells[5].Controls.Add(a);
}
if (GVAnswer.Rows[i].Cells[7].Text == "Yes")
{
j++;
ViewState["CheckHasMulAns"] = j;// To Chek How Many answer Of a particulaer Question Is Right
}
GVAnswer.Rows[i].Cells[8].Visible = false;
GVAnswer.Rows[i].Cells[3].Visible = false;
GVAnswer.Rows[i].Cells[10].Visible = false;
GVAnswer.Rows[i].Cells[6].Visible = false;
GVAnswer.Rows[i].Cells[11].Visible = false;
GVAnswer.Rows[i].Cells[2].Visible = false;
}
}
}
catch (Exception ex)
{
string err = ex.Message;
if (ex.InnerException != null)
{
err = err + " :: Inner Exception :- " + ex.InnerException.Message;
}
string addInfo = "Error in getting Answers :: -> ";
ClsExceptionPublisher objPub = new ClsExceptionPublisher();
objPub.Publish(err, addInfo);
}
}
Como quiera ocultar su columna, siempre puede ocultar la columna en el evento preRender de la vista de cuadrícula. Esto lo ayuda a reducir una operación por cada evento de fila de destino por fila. Necesitarás solo una operación para el evento de prerender.
protected void gvVoucherList_PreRender(object sender, EventArgs e)
{
try
{
int RoleID = Convert.ToInt32(Session["RoleID"]);
switch (RoleID)
{
case 6: gvVoucherList.Columns[11].Visible = false;
break;
case 1: gvVoucherList.Columns[10].Visible = false;
break;
}
if(hideActionColumn == "ActionSM")
{
gvVoucherList.Columns[10].Visible = false;
hideActionColumn = string.Empty;
}
}
catch (Exception Ex)
{
}
}
Este fue el código que funcionó para mí cuando la columna Id es desconocida y AutoGenerateColumns == verdadero;
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Drawing" %>
<html>
<head runat="server">
<script runat="server">
protected void Page_Load(object sender, EventArgs eventArgs)
{
DataTable data = new DataTable();
data.Columns.Add("Id", typeof(int));
data.Columns.Add("Notes", typeof(string));
data.Columns.Add("RequestedDate", typeof(DateTime));
for (int idx = 0; idx < 5; idx++)
{
DataRow row = data.NewRow();
row["Id"] = idx;
row["Notes"] = string.Format("Note {0}", idx);
row["RequestedDate"] = DateTime.Now.Subtract(new TimeSpan(idx, 0, 0, 0, 0));
data.Rows.Add(row);
}
listData.DataSource = data;
listData.DataBind();
}
private void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
foreach (TableCell tableCell in e.Row.Cells)
{
DataControlFieldCell cell = (DataControlFieldCell)tableCell;
if (cell.ContainingField.HeaderText == "Id")
{
cell.Visible = false;
continue;
}
if (cell.ContainingField.HeaderText == "Notes")
{
cell.Width = 400;
cell.BackColor = Color.Blue;
continue;
}
if (cell.ContainingField.HeaderText == "RequestedDate")
{
cell.Width = 130;
continue;
}
}
}
</script>
</head>
<body>
<form runat="server">
<asp:GridView runat="server" ID="listData" AutoGenerateColumns="True" HorizontalAlign="Left"
PageSize="20" OnRowDataBound="GridView_RowDataBound" EmptyDataText="No Data Available."
Width="95%">
</asp:GridView>
</form>
</body>
</html>
Esto me ayudó
this.myGridview.Columns[0].Visible = false;
Aquí 0 es el índice de columna que quiero ocultar.
Hay un pequeño cambio que sucederá, no estará en rowdatabound, primero todas las filas deberían estar atadas, solo entonces podríamos ocultar eso. Entonces será un método separado después de que la grilla sea dataBound.
Lo que la mayoría de las respuestas aquí no explican es: ¿y si necesita hacer que las columnas sean visibles de nuevo e invisibles, todas basadas en datos dinámicamente? Después de todo, ¿no deberían GridViews
datos?
¿Qué sucede si quiere activar o desactivar columnas en función de sus datos?
Mi Gridview
<asp:GridView ID="gvLocationBoard" runat="server" AllowPaging="True" AllowSorting="True" ShowFooter="false" ShowHeader="true" Visible="true" AutoGenerateColumns="false" CellPadding="4" ForeColor="#333333" GridLines="None"
DataSourceID="sdsLocationBoard" OnDataBound="gvLocationBoard_DataBound" OnRowDataBound="gvLocationBoard_RowDataBound" PageSize="15" OnPreRender="gvLocationBoard_PreRender">
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<Columns>
<asp:TemplateField HeaderText="StudentID" SortExpression="StudentID" Visible="False">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text=''<%# Eval("StudentID") %>''></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Student" SortExpression="StudentName">
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text=''<%# Eval("StudentName") %>''></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Status" SortExpression="CheckStatusName" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:HiddenField ID="hfStatusID" runat="server" Value=''<%# Eval("CheckStatusID") %>'' />
<asp:Label ID="Label4" runat="server" Text=''<%# Eval("CheckStatusName") %>''></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="RollCallPeriod0" Visible="False">
<ItemTemplate>
<asp:CheckBox ID="cbRollCallPeriod0" runat="server" />
<asp:HiddenField ID="hfRollCallPeriod0" runat="server" Value=''<%# Eval("RollCallPeriod") %>'' />
</ItemTemplate>
<HeaderStyle Font-Size="Small" />
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
<asp:TemplateField HeaderText="RollCallPeriod1" Visible="False">
<ItemTemplate>
<asp:CheckBox ID="cbRollCallPeriod1" runat="server" />
<asp:HiddenField ID="hfRollCallPeriod1" runat="server" Value=''<%# Eval("RollCallPeriod") %>'' />
</ItemTemplate>
<HeaderStyle Font-Size="Small" />
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
..
etc..
Tenga en cuenta el `" RollCallPeriodn ", donde ''n'' es un número secuencial.
La forma en que lo hago es, por diseño, ocultar todas las columnas que sé que estarán ON (visible = "true") u OFF (visible = "false") más adelante, y según mis datos.
En mi caso, quiero mostrar los tiempos de los periodos hasta cierta columna. Entonces, por ejemplo, si hoy son las 9 am, entonces quiero mostrar los períodos 6am, 7am, 8am y 9am, pero no 10am, 11am, etc.
En otros días quiero mostrar TODAS las veces. Y así.
¿Entonces como hacemos esto?
¿Por qué no utilizar PreRender
para "restablecer" la vista de Gridview
?
protected void gvLocationBoard_PreRender(object sender, EventArgs e)
{
GridView gv = (GridView)sender;
int wsPos = 3;
for (int wsCol = 0; wsCol < 19; wsCol++)
{
gv.Columns[wsCol + wsPos].HeaderText = "RollCallPeriod" + wsCol.ToString("{0,00}");
gv.Columns[wsCol + wsPos].Visible = false;
}
}
Ahora active las columnas que necesita basándose en encontrar el Comienzo del Texto del encabezado y haga que la columna sea visible si el texto del encabezado no es el predeterminado.
protected void gvLocationBoard_DataBound(object sender, EventArgs e)
{
//Show the headers for the Period Times directly from sdsRollCallPeriods
DataSourceSelectArguments dss = new DataSourceSelectArguments();
DataView dv = sdsRollCallPeriods.Select(dss) as DataView;
DataTable dt = dv.ToTable() as DataTable;
if (dt != null)
{
int wsPos = 0;
int wsCol = 3; //start of PeriodTimes column in gvLocationBoard
foreach (DataRow dr in dt.Rows)
{
gvLocationBoard.Columns[wsCol + wsPos].HeaderText = dr.ItemArray[1].ToString();
gvLocationBoard.Columns[wsCol + wsPos].Visible = !gvLocationBoard.Columns[wsCol + wsPos].HeaderText.StartsWith("RollCallPeriod");
wsPos += 1;
}
}
}
No revelaré el SqlDataSource
aquí, pero basta con decir con PreRender
, puedo restablecer mi GridView
y activar las columnas que quiero con los encabezados que quiero.
Así que la forma en que funciona es que cada vez que selecciona una fecha o un período de tiempo diferente para mostrar como encabezados, restablece el GridView al texto del encabezado predeterminado y al estado Visible = "falso" antes de construir nuevamente la vista de gridview
. De lo contrario, sin PreRender
, el GridView tendrá los encabezados de los datos anteriores, ya que el código que está detrás elimina la configuración predeterminada .
Por favor usa este código Esto hace que la columna sea invisible si está vacía ...
protected void gridview1_DataBound(object sender, EventArgs e)
{
Boolean hasData = false;
for (int col = 0; col < gridview1.HeaderRow.Cells.Count; col++)
{
for (int row = 0; row < gridview1.Rows.Count; row++)
{
if (!String.IsNullOrEmpty(gridview1.Rows[row].Cells[col].Text)
&& !String.IsNullOrEmpty(HttpUtility.HtmlDecode(gridview1.Rows[row].Cells[col].Text).Trim()))
{
hasData = true;
break;
}
}
if (!hasData)
{
gridview1.HeaderRow.Cells[col].Visible = false;
for (int hiddenrows = 0; hiddenrows < gridview1.Rows.Count; hiddenrows++)
{
gridview1.Rows[hiddenrows].Cells[col].Visible = false;
}
}
hasData = false;
}
}
Puede ocultar una columna específica consultando la colección de control de datos para el texto del encabezado de columna deseado y configurando su visibilidad en verdadero.
((DataControlField)gridView.Columns
.Cast<DataControlField>()
.Where(fld => (fld.HeaderText == "Title"))
.SingleOrDefault()).Visible = false;
Si desea ocultar una columna por su nombre en lugar de su índice en GridView. Después de crear DataTable o Dataset, debe encontrar el índice de la columna por su nombre y luego guardar el índice en la variable global como ViewStae, Session y etc. y luego llamarlo en RowDataBound, como en el ejemplo:
string headerName = "Id";
DataTable dt = .... ;
for (int i=0;i<dt.Columns.Count;i++)
{
if (dt.Columns[i].ColumnName == headerName)
{
ViewState["CellIndex"] = i;
}
}
... GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header || e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Footer)
{
int index = Convert.ToInt32(ViewState["CellIndex"]);
e.Row.Cells[index].Visible = false;
}
}
Si quieres ocultar esa columna mientras la cuadrícula está poblada, puedes hacerlo en la página aspx como esta
<asp:BoundField DataField="test" HeaderText="test" Visible="False" />
GridView.Columns.Count
siempre será 0 cuando su GridView tenga su propiedad AutoGenerateColumns
establecida en true
(el valor predeterminado es true
).
Puede declarar explícitamente sus columnas y establecer la propiedad AutoGenerateColumns
en false
, o puede usar esto en su código subyacente:
GridView.Rows[0].Cells.Count
para obtener el conteo de la columna una vez que los datos de GridView hayan sido enlazados, o esto:
protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
e.Row.Cells[index].Visible = false;
}
para establecer una columna invisible utilizando el evento RowDataBound
su GridView.
private void Registration_Load(object sender, EventArgs e)
{
//hiding data grid view coloumn
datagridview1.AutoGenerateColumns = true;
datagridview1.DataSource =dataSet;
datagridview1.DataMember = "users"; // users is table name
datagridview1.Columns[0].Visible = false;//hiding 1st coloumn coloumn
datagridview1.Columns[2].Visible = false; hiding 2nd coloumn
datagridview1.Columns[3].Visible = false; hiding 3rd coloumn
//end of hiding datagrid view coloumns
}
}