嵌套控件可见性问题

时间:2011-04-14 14:41:25

标签: c# .net-3.5 visibility

今天早上在处理错误时注意到了这一点。我的页面上有这样的内容:

<div id="dvDropShipMsgWrap" runat="server" visible="false" class="systemMsgCon">
    <div id="dvDropShipMsg" class="systemMsg plus">
        <asp:Label ID="lblAttributeDropShipMsg" runat="server" ForeColor="#333333" Visible="false"
            Style="font-weight: normal;"></asp:Label>
    </div>
</div>

在后面的代码中有这个:

if(myCondition)
    lblAttributeDropShipMsg.Visible = p.DropShipable;
else
    <snip>

dvDropShipMsgWrap.Visible = p.DropShipable;

跟踪代码,我发现lblAttributeDropShipMsg.Visible属性总是为false,即使将其设置为true也是如此。将其更改为:

dvDropShipMsgWrap.Visible = p.DropShipable;
lblAttributeDropShipMsg.Visible = p.DropShipable;

修复了问题。

在设置父级之前,我无法设置嵌套控件的可见性,这似乎很奇怪。任何人都能提供一些启示吗?

1 个答案:

答案 0 :(得分:7)

我运行了一些测试,使用与示例中完全相同的声明性标记。我的代码如下所示。右边的评论显示了两个元素的价值。 {/ 1}}属性,在每个注释左侧的代码执行之后。我使用了本地变量.Visibleparent来使事情更加清晰。

child

我认为第3行的结果可能就是您观察到的行为。但是这里的情况比起初看起来要多。

如果查看获取/设置控件的 1 var parent = dvDropShipMsgWrap; // parent child 2 var child = lblAttributeDropShipMsg; // false false (initial values) 3 child.Visible = true; // false false 4 parent.Visible = true; // true true 5 parent.Visible = false; // false false 6 child.Visible = false; // false false 7 parent.Visible = true; // true false 属性的CIL代码,您会发现设置控件的值实际上会影响内部位标志的值,无论父母的可见度如何。但是,在获取控件的.Visible属性的值时,代码遍历从给定控件开始的路径,直到其父级,然后到父级的父级,依此类推,向控制层次结构的根目录。如果沿途任何控件的内部位标志指示&#34;不可见&#34;,则遍历停止,并返回值.Visible。返回false的唯一方法是遍历是否一直到根,而没有找到任何不可见的控件。

所以,总而言之,设置一个控件的true属性是记得&#34;&#34;在内部,但如果其任何祖先不可见,则该属性的值将返回.Visible。当控件的所有祖先都可见时,控件的false属性的值将被记住&#34;记住&#34;从上次设置时的值。