使用visible true在另一个隐藏元素中渲染隐藏元素

时间:2014-07-02 09:21:43

标签: c# html asp.net vb.net visibility

问题

当容器设置为visible="true"时,如果同时也将visible="true"设置为visible="true",则其内容不会呈现。

示例

当为模板字段及其中的文本框设置<asp:TemplateField HeaderText="Sample" Visible="false"> <ItemTemplate> <asp:TextBox ID="txt" runat="Server" Visible="false"/> </ItemTemplate> </asp:TemplateField> 时(如下所示),将呈现模板字段(整个列),但文本框仍保持未呈现状态。

display:none

此处的目标是渲染整个列,同时仅显示选定行中的文本框。

WHY吗

我知道这是因为文本框尝试渲染时模板字段不存在。

我也知道,如果使用{{1}} (维护DOM中的对象),则会按预期进行渲染。

问题

假设必须使用可见的假:

如何将文本框设置为可见true并与模板字段同时呈现?


注意:对于那些打算问为什么你需要在隐藏元素中隐藏虚假的人?这是因为每一行(templatefield)都会被渲染,但只会选择文本框。

2 个答案:

答案 0 :(得分:1)

所以你想要显示列,但只显示所选行的文本框?

我会使用RowDataBound

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        TextBox txt = (TextBox) e.Row.FindControl("txt");
        txt.Visible = e.Row == ((GridView)sender).SelectedRow;
    }
}

或通过索引:

txt.Visible = e.Row.RowIndex == ((GridView)sender).SelectedIndex;

但是当然整个列都需要可见,因为这个属性是从它的容器继承的。这意味着,仅当子控件可见时,它们的父控件都不可见,才能看到它。

<asp:TemplateField Visible="true">

答案 1 :(得分:1)

  

对于那些打算问为什么你需要隐藏元素中的可见虚假的人?这是因为每一行(templatefield)都将被渲染,但只能选择文本框。

你在这里回答了自己的问题,如果每个TemplateField都需要渲染,那么设置Visible=false就不行了。来自docs

  

获取或设置一个值,该值指示是否呈现数据控件字段。

鉴于您总是希望呈现TemplateField,实际上您想要更改TextBox的可见性,而不是TemplateField。这可以通过多种方式实现,这完全取决于您想要什么样的可见性,例如如果你想渲染它但保持隐藏,那么你可以在CSS中设置visibility=hidden,这意味着它将保留它的布局属性,即宽度/高度等。如果你想以一种不影响的方式隐藏它布局使用display:none,最后,如果您不希望它在Visible=false上的所有set TextBox属性上呈现。