【问题标题】:Nested Control Visibility Question嵌套控件可见性问题
【发布时间】:2011-08-05 14:47:18
【问题描述】:

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

<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;

解决了问题。

在设置其父级之前我无法设置嵌套控件的可见性似乎很奇怪。谁能给点启示?

【问题讨论】:

    标签: c# .net-3.5 visibility


    【解决方案1】:

    我运行了一些测试,使用与您的示例完全相同的声明性标记。我的代码如下所示。右侧的注释显示两个元素的.Visible 属性的值,在每个注释左侧的代码执行之后。我使用了局部变量parentchild 让事情变得更清晰。

     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 行的结果可能是您观察到的行为。但这里发生的事情比最初看起来的要多。

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

    因此,总而言之,设置控件的.Visible 属性在内部是“记住的”,但如果其任何祖先不可见,则该属性的值将返回为false。当控件的所有祖先都可见时,控件的.Visible 属性的值将是上次设置时的“记住”值。

    【讨论】:

    • 很好的解释。谢谢。
    猜你喜欢
    • 2012-05-11
    • 2023-01-04
    • 2011-06-24
    • 1970-01-01
    • 2011-02-17
    • 2011-02-25
    • 1970-01-01
    • 2011-05-04
    • 2013-01-26
    相关资源
    最近更新 更多