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
.
For Each dcfColumn As DataControlField In gvGridview.Columns
If dcfColumn.HeaderText = "ColumnHeaderText" Then
dcfColumn.Visible = false
End If
Next
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>
GridView1.Columns[columnIndex].Visible = false;
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";
}
}
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>
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.
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;
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>");
}
}
}