我有一个没有正确设置的布尔值。是什么造成的?

时间:2011-03-03 13:44:20

标签: asp.net vb.net variable-assignment

我在Asp.Net用户控件中有以下代码:

Me.pnlAddComment.Visible = MyBase.Associate.IsAgent()
Me.lblRating.Visible = Me.pnlAddComment.Visible
Me.Rating1.Visible = Me.pnlAddComment.Visible

现在,当我运行此代码时,MyBase.Associate.IsAgent()的值为true。然而,Me.pnlAddComment.Visible在任何时候都没有评估为真。当我将结果输出为Response.Write语句时,它显示IsAgent = True,pnlAddComment.Visible = False。当我在调试模式下运行时,将换行符放在上面的第二行以允许设置发生:我将鼠标放在IsAgent上并显示“True”;我将鼠标放在pnlAddComment.Visible上,显示“False”。

一位同事建议,它可能是getter中的Panel.Visible黑盒子代码,允许分配发生但返回false,因为某些父对象被设置(在代码执行的那一点)为False 。我已经查看了父对象,并且在任何时候都没有将它们设置为不可见。

如果这是一个引用类型,我可能会确信某个其他进程正在修改此赋值与实际使用时的引用(在Render中),但这恰好发生在这行代码中。

什么会导致这个布尔赋值以这种方式表现而不抛出异常?

解决方案:
答案结果是位于用户控件本身之外的控件层次结构中的父对象。由于没有明确地设置为false,并且我同意@Shadow向导,@ Damien_The_Unbeliever和@ CodeMonkey1,它必须是一些影响面板的外部控制,我决定使用递归while循环来测试每个的父级。此时层次结构中的用户控件:

Dim o as Object = Me.pnlAddComment.Parent

While o IsNot Nothing
    Me.lblMessage.Text &= "<br />" & o.ID & ": " & o.Visible.ToString()
    o = o.Parent
End While

然后我只是在服务器上运行它,输出回来时链中每个控件的完全可见性。最终发生的是该控件包含在MultiView中的视图控件中。此视图控件应该是可见的,因为它应该是此特定调用的ActiveView,但是在我的代码运行的生命周期中,该视图尚未被标识为活动视图。由于它没有正式激活,因此视图隐式为false,并且当查询Visible时,所有子控件都返回false值。

其余的分配从该点开始按预期运行。 lblRating控件设置为false(永久),因为此时pnlAddComment的正确可见性设置为false。我在这里学到的教训是,当有另一种(同样简单的)方法时,不要以这种方式使控制可见性相互依赖。

3 个答案:

答案 0 :(得分:2)

如果任何控件的祖先不可见,Visible getter将返回false。

答案 1 :(得分:0)

您正在使用的面板也定义了Visible propery?它可能会从基类中隐藏Visible属性,这意味着该面板有2个属性。一个在父母身上,一个在孩子身上有不同的价值观。即 myPanel.Visible = False
myPanel.Base.Visible = True

答案 2 :(得分:0)

检查它是否有隐藏的任何父控件,通过粘贴一些代码将使事情更加清晰。这可能是继承父属性的问题......但我不确定..除非,代码存在