net getvalue false column but asp asp.net .net data-binding gridview exception-handling

asp.net - getvalue - Cómo ocultar una columna de TemplateField en un GridView



gridview hide column (9)

void protegido gvLogMessageDetail_RowDataBound (remitente del objeto, GridViewRowEventArgs e)
{

if (e.Row.RowType == DataControlRowType.Header) { if (rdlForImportOrExport.SelectedIndex == 1) { e.Row.Cells[3].Visible = false; e.Row.Cells[4].Visible = false; e.Row.Cells[5].Visible = false; } else { e.Row.Cells[3].Visible = true; e.Row.Cells[4].Visible = true; e.Row.Cells[5].Visible = true; } } if (e.Row.RowType == DataControlRowType.DataRow) //skip header row { try { if (rdlForImportOrExport.SelectedIndex == 1) { e.Row.Cells[3].Visible = false; e.Row.Cells[4].Visible = false; e.Row.Cells[5].Visible = false; } else { e.Row.Cells[3].Visible = true; e.Row.Cells[4].Visible = true; e.Row.Cells[5].Visible = true; } } catch { ClientScript.RegisterStartupScript(GetType(), "Expand", "<SCRIPT LANGUAGE=''javascript''>alert(''There is binding problem in child grid.'');</script>"); } } }

¿Cómo puedo ocultar una columna de TemplateField en un GridView?

Intenté lo siguiente:

<asp:TemplateField ShowHeader="False" Visible=''<%# MyBoolProperty %>'' > <ItemTemplate> <asp:LinkButton ID="attachmentButton" runat="server" ... /> </ItemTemplate>

pero no funcionó y da el siguiente error:

Las expresiones de enlace de datos solo se admiten en objetos que tienen un evento DataBinding. System.Web.UI.WebControls.TemplateField no tiene un evento DataBinding.

Intenté también ocultarlo programáticamente, pero parece que no es posible obtener una columna por el nombre porque no hay ningún nombre para TemplateField columna TemplateField .


Esta puede ser otra forma de hacerlo y validar los nulos

DataControlField dataControlField = UsersGrid.Columns.Cast<DataControlField>().SingleOrDefault(x => x.HeaderText == "Email"); if (dataControlField != null) dataControlField.Visible = false;


GridView1.Columns [columnIndex] .Visible = false;


Me estoy perdiendo de algo ?

Si no puede establecer la visibilidad en TemplateField, configúrelo en su contenido

<asp:TemplateField> <ItemTemplate> <asp:LinkButton Visible=''<%# MyBoolProperty %>'' ID="foo" runat="server" ... /> </ItemTemplate> </asp:TemplateField>

o si su contenido es complejo, enciérrelo en un div y establezca la visibilidad en el div

<asp:TemplateField> <ItemTemplate> <div runat="server" visible=''<%# MyBoolProperty %>'' > <asp:LinkButton ID="attachmentButton" runat="server" ... /> </div> </ItemTemplate> </asp:TemplateField>


Si me parece que las filas donde Visible se establece en falso no serán accesibles, que se eliminan del DOM en lugar de ocultarse, por lo que también utilicé el enfoque Display: None. En mi caso, quería tener una columna oculta que contuviera la clave de la fila. Para mí, este enfoque declarativo es un poco más limpio que algunos de los otros enfoques que usan código.

<style> .HiddenCol{display:none;} </style> <%--ROW ID--%> <asp:TemplateField HeaderText="Row ID"> <HeaderStyle CssClass="HiddenCol" /> <ItemTemplate> <asp:Label ID="lblROW_ID" runat="server" Text=''<%# Bind("ROW_ID") %>''></asp:Label> </ItemTemplate> <ItemStyle HorizontalAlign="Right" CssClass="HiddenCol" /> <EditItemTemplate> <asp:TextBox ID="txtROW_ID" runat="server" Text=''<%# Bind("ROW_ID") %>''></asp:TextBox> </EditItemTemplate> <FooterStyle CssClass="HiddenCol" /> </asp:TemplateField>


Una ligera mejora usando el nombre de la columna, en mi humilde opinión:

Private Sub GridView1_Init(sender As Object, e As System.EventArgs) Handles GridView1.Init For Each dcf As DataControlField In GridView1.Columns Select Case dcf.HeaderText.ToUpper Case "CBSELECT" dcf.Visible = Me.CheckBoxVisible dcf.HeaderText = "<small>Select</small>" End Select Next End Sub

Esto permite el control sobre múltiples columnas. Inicialmente uso un nombre de columna ''técnico'', que coincide con el nombre de control dentro. Esto hace que sea obvio dentro de la página ASCX que es una columna de control. Luego cambie el nombre como desee para la presentación. Si veo el extraño nombre en producción, sé que me salté algo. El "ToUpper" evita problemas de casos.

Finalmente, esto se ejecuta UNA vez en cualquier publicación en lugar de capturar el evento durante la creación de filas.


prueba esto

.hiddencol { display:none; } .viscol { display:block; }

agregue el siguiente código en el evento RowCreated de GridView

protected void OnRowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Cells[0].CssClass = "hiddencol"; } else if (e.Row.RowType == DataControlRowType.Header) { e.Row.Cells[0].CssClass = "hiddencol"; } }


For Each dcfColumn As DataControlField In gvGridview.Columns If dcfColumn.HeaderText = "ColumnHeaderText" Then dcfColumn.Visible = false End If Next


protected void OnRowCreated(object sender, GridViewRowEventArgs e) { e.Row.Cells[columnIndex].Visible = false; } Si no prefiere el índice codificado, la única solución alternativa que puedo sugerir es proporcionar un HeaderText de HeaderText para GridViewColumn y luego buscar la columna con HeaderText .

protected void UsersGrid_RowCreated(object sender, GridViewRowEventArgs e) { ((DataControlField)UsersGrid.Columns .Cast<DataControlField>() .Where(fld => fld.HeaderText == "Email") .SingleOrDefault()).Visible = false; }