still ocultar its how getvalue columna column but c# asp.net

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 } }