如何在GridView中隐藏TemplateField列?
我尝试了以下内容:
<asp:TemplateField ShowHeader="False" Visible='<%# MyBoolProperty %>' >
<ItemTemplate>
<asp:LinkButton ID="attachmentButton" runat="server" ... />
</ItemTemplate>
但它不起作用并给出以下错误:
仅在具有DataBinding事件的对象上支持数据绑定表达式。 System.Web.UI.WebControls.TemplateField没有DataBinding事件。
我还试图以编程方式隐藏它,但似乎不可能通过名称获取列,因为TemplateField
列没有名称。
答案 0 :(得分:54)
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;
}
答案 1 :(得分:9)
For Each dcfColumn As DataControlField In gvGridview.Columns
If dcfColumn.HeaderText = "ColumnHeaderText" Then
dcfColumn.Visible = false
End If
Next
答案 2 :(得分:7)
如果我觉得Visible设置为false的行将无法访问,那么它们将从DOM中删除而不是隐藏,因此我还使用了Display:None方法。就我而言,我希望有一个包含Row键的隐藏列。对我来说,这种声明性方法比使用代码的其他一些方法更清晰。
<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>
答案 3 :(得分:5)
GridView1.Columns[columnIndex].Visible = false;
答案 4 :(得分:4)
试试这个
.hiddencol
{
display:none;
}
.viscol
{
display:block;
}
在GridView的RowCreated事件上添加以下代码
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";
}
}
答案 5 :(得分:1)
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>");
}
}
}
答案 6 :(得分:1)
我错过了什么吗?
如果您无法在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>
答案 7 :(得分:1)
这可以是另一种方法,并验证空值
DataControlField dataControlField = UsersGrid.Columns.Cast<DataControlField>().SingleOrDefault(x => x.HeaderText == "Email");
if (dataControlField != null)
dataControlField.Visible = false;
答案 8 :(得分:1)
使用列名称进行轻微改进,恕我直言:
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”避免了案件问题。
最后,这会在任何帖子上运行一次,而不是在创建行时捕获事件。