问题
当容器设置为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)都会被渲染,但只会选择文本框。
答案 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
属性上呈现。