嵌套控件可见性问题

| 今天早上在解决错误时注意到了这一点。我的页面上有这样的内容:
<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;
解决了问题。 在设置父控件之前,我无法设置嵌套控件的可见性似乎很奇怪。有人可以提供一些启示吗?     
已邀请:
我使用与您的示例完全相同的声明性标记运行了一些测试。我后面的代码如下所示。执行每个注释左侧的代码后,右侧的注释显示两个元素的“ 3”属性的值。我使用局部变量
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 
我认为第3行的结果可能是您观察到的行为。但是这里发生的事情比起初看起来要多。 如果查看获取/设置控件的“ 3”属性的CIL代码,则会发现设置控件的值实际上确实会影响内部位标志的值,而与父级的可见性无关。但是,当获取控件的
.Visible
属性的值时,代码将遍历从给定控件开始的路径,直至其父级,然后再到父级的父级,依此类推,直至该控件的根控制层次结构。如果沿途的任何控件的内部位标志指示“不可见”,则遍历停止,并返回值“ 9”。返回“ 10”的唯一方法是遍历完全到达根,而没有找到任何不可见的控件。 因此,总而言之,在内部将控件的ѭ3setting属性设置为“记住”,但是如果看不到其祖先,则该属性的值将返回为
false
。当控件的所有祖先可见时,控件的
.Visible
属性的值将为上次设置后的“记住的”值。     

要回复问题请先登录注册