嵌套控件可见性问题

Jim*_*m B 2 c# visibility .net-3.5

今天早上在处理bug时注意到这一点.我的页面上有这样的内容:

<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>
Run Code Online (Sandbox Code Playgroud)

并在后面的代码中有这个:

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

dvDropShipMsgWrap.Visible = p.DropShipable;
Run Code Online (Sandbox Code Playgroud)

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

dvDropShipMsgWrap.Visible = p.DropShipable;
lblAttributeDropShipMsg.Visible = p.DropShipable;
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.

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

Joe*_*Lee 7

我运行了一些测试,使用与示例中完全相同的声明性标记.我的代码如下所示.右边的注释显示了.Visible每个注释左边的代码执行后两个元素属性的值.我使用了当地的varialbes parent,child并使事情更清晰.

 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 
Run Code Online (Sandbox Code Playgroud)

我认为第3行的结果可能就是您观察到的行为.但这里发生的事情比起初看起来更多.

如果查看获取/设置控件.Visible属性的CIL代码,您会发现设置控件的值实际上会影响内部位标志的值,而不管父级的可见性如何.但是,在获取控件.Visible属性的值时,代码将遍历从给定控件开始的路径,直到其父级,然后到父级的父级,依此类推,直到控制层次结构的根.如果沿途任何控件的内部位标志指示"不可见",则遍历停止,并false返回该值.返回的唯一方法true是遍历是否一直到root,而没有找到任何不可见的控件.

所以,综上所述,设置控件的.Visible属性是"记住"内,但将返回属性的值作为false如果任何祖先是不可见的.当控件的所有祖先都可见时,控件.Visible属性的值将是从上次设置时的"记住"值.