web-dev-qa-db-fra.com

Comment masquer une colonne TemplateField dans une GridView

Comment masquer une colonne TemplateField dans une GridView?

J'ai essayé ce qui suit:

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

mais cela n'a pas fonctionné et donne l'erreur suivante:

Les expressions de liaison de données ne sont prises en charge que sur les objets qui ont un événement DataBinding. System.Web.UI.WebControls.TemplateField n'a pas d'événement DataBinding.

J'ai également essayé de le masquer par programme, mais il semble qu'il ne soit pas possible d'obtenir une colonne par le nom car il n'y a pas de nom pour la colonne TemplateField.

37
Homam
For Each dcfColumn As DataControlField In gvGridview.Columns
    If dcfColumn.HeaderText = "ColumnHeaderText" Then
        dcfColumn.Visible = false                    
    End If
Next
9
Deepak Mishra

S'il me semble que les lignes où Visible est défini sur false ne seront pas accessibles, qu'elles sont supprimées du DOM plutôt que masquées, j'ai donc également utilisé l'approche Display: None. Dans mon cas, je voulais avoir une colonne cachée contenant la clé de la ligne. Pour moi, cette approche déclarative est un peu plus propre que certaines des autres approches qui utilisent du code.

<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>
7
ChadD
GridView1.Columns[columnIndex].Visible = false;
5
Gupta Sandeepkumar

essaye ça

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

ajouter le code suivant sur l'événement 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";
     }
}
4
santosh singh

Suis-je en train de manquer quelque chose?

Si vous ne pouvez pas définir la visibilité sur TemplateField, définissez-la sur son contenu

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

ou si votre contenu est complexe, insérez-le dans un div et définissez la visibilité sur le div

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

Une légère amélioration en utilisant le nom de la colonne, à mon humble avis:

    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

Cela permet de contrôler plusieurs colonnes. J'utilise initialement un nom de colonne "technique", correspondant au nom du contrôle. Cela rend évident dans la page ASCX qu'il s'agit d'une colonne de contrôle. Échangez ensuite le nom comme vous le souhaitez pour la présentation. Si j'espionne le nom étrange en production, je sais que j'ai sauté quelque chose. Le "ToUpper" évite les problèmes de cas.

Enfin, cela s'exécute UNE fois sur n'importe quel message au lieu de capturer l'événement lors de la création de la ligne.

1
davidWazy

Cela peut être une autre façon de le faire et de valider les valeurs nulles

DataControlField dataControlField = UsersGrid.Columns.Cast<DataControlField>().SingleOrDefault(x => x.HeaderText == "Email");
            if (dataControlField != null)
                dataControlField.Visible = false;
1
Juanito
protected void gvLogMessageDetail_RowDataBound(object sender, 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>");  
            }  
        }  
    }  
1
Digvijay Rajput