Как скрыть столбец TemplateField в GridView - PullRequest
37 голосов
/ 10 февраля 2011

Как я могу скрыть столбец TemplateField в GridView?

Я попробовал следующее:

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

, но это не сработало и дает следующееошибка:

Выражения привязки данных поддерживаются только для объектов, имеющих событие DataBinding.System.Web.UI.WebControls.TemplateField не имеет события DataBinding.

Я также пытался скрыть его программным способом, но, кажется, невозможно получить столбец по имени, потому что имени нет.для столбца TemplateField.

Ответы [ 9 ]

54 голосов
/ 10 февраля 2011
protected void OnRowCreated(object sender, GridViewRowEventArgs e)
{
         e.Row.Cells[columnIndex].Visible = false;
}

<ч /> Если вы не предпочитаете жестко закодированный индекс, единственное решение, которое я могу предложить, это предоставить HeaderText для GridViewColumn, а затем найти столбец с использованием этого HeaderText.

protected void UsersGrid_RowCreated(object sender, GridViewRowEventArgs e)
{
    ((DataControlField)UsersGrid.Columns
            .Cast<DataControlField>()
            .Where(fld => fld.HeaderText == "Email")
            .SingleOrDefault()).Visible = false;
}
9 голосов
/ 17 февраля 2012
For Each dcfColumn As DataControlField In gvGridview.Columns
    If dcfColumn.HeaderText = "ColumnHeaderText" Then
        dcfColumn.Visible = false                    
    End If
Next
7 голосов
/ 30 июня 2012

Если мне кажется, что строки, для которых для Visible установлено значение false, не будут доступны, они будут удалены из DOM, а не скрыты, поэтому я также использовал подход Display: None. В моем случае я хотел иметь скрытый столбец, который содержал ключ строки. Для меня этот декларативный подход немного чище, чем некоторые другие подходы, использующие код.

<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>
5 голосов
/ 16 ноября 2012
GridView1.Columns[columnIndex].Visible = false;
4 голосов
/ 10 февраля 2011

попробуйте

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

добавить следующий код в событие RowCreated 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";
     }
}
1 голос
/ 05 ноября 2014

A незначительное улучшение с использованием имени столбца, ИМХО:

    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

Это позволяет контролировать несколько столбцов.Сначала я использую «техническое» имя столбца, соответствующее имени элемента управления внутри.На странице ASCX становится очевидным, что это контрольный столбец.Затем смените название по желанию для презентации.Если я подскажу странное имя на производстве, я знаю, что что-то пропустил.«ToUpper» позволяет избежать проблем с регистром.

Наконец, он запускается ОДНО раз в любом сообщении вместо захвата события во время создания строки.

1 голос
/ 04 июля 2014

Это может быть еще один способ сделать это и проверить пустые значения

DataControlField dataControlField = UsersGrid.Columns.Cast<DataControlField>().SingleOrDefault(x => x.HeaderText == "Email");
            if (dataControlField != null)
                dataControlField.Visible = false;
1 голос
/ 28 февраля 2014

Я что-то упустил?

Если вы не можете установить видимость в TemplateField, тогда установите его для его содержимого

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

или если ваш контент сложный, тогда заключите его в divи установите видимость на div

<asp:TemplateField>
  <ItemTemplate>
    <div runat="server" visible='<%# MyBoolProperty  %>' >
      <asp:LinkButton ID="attachmentButton" runat="server" ... />
    </div>
  </ItemTemplate>
</asp:TemplateField> 
1 голос
/ 14 июня 2012
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>");  
            }  
        }  
    }  
...