2011-03-03 104 views
0

我有一個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」。

一位同事建議可能在獲取器中有Panel.Visible黑盒子代碼,允許分配發生,但由於某些父對象被設置爲(在代碼執行中的那一點)False,所以返回false。我回顧了父對象,並且從來沒有將它們中的任何一個設置爲不可見。

如果這是一個引用類型,我可能會相信其他進程正在修改此賦值與實際使用(在Render中)之間的引用,但是這正好發生在這行代碼中。

什麼會導致這種布爾分配行爲這種方式沒有拋出異常?

解決方案:
答案竟然是在位於用戶控制本身的外側的控制層次結構中的父對象。由於沒有任何明確的設置爲false,我同意@Shadow Wizard,@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。我在這裏學到的教訓不是使控制可見性以這種方式依賴於彼此,而是有一種替代方法(以及簡單的方法)。

+0

這不能由.NET行爲解釋,所以它必須是'IsAgent()'方法的代碼的東西 - 在這裏發佈,我們會看到。例如,它可能會「切換」它的返回值 - 第一次調用返回「真」,第二次調用返回「假」等 – 2011-03-03 13:48:36

+0

@Joel另一個想法 - 如果你設置返回值爲變量第一'昏暗blnIsAgent作爲布爾= MyBase.Associate .IsAgent()會發生什麼?有什麼不同? – 2011-03-03 13:50:20

+0

@Shadow Wizard:其中沒有任何真實的代碼。用戶名變量由cookie值填充。然後用2個由'OrElse'分隔的'Contains'調用來測試這個字符串。無論如何,它的評估都是正確的。問題是,爲什麼專家組的可見屬性在給定賦值的情況下評估不一樣? – 2011-03-03 13:51:33

回答

2

如果任何控件的祖先不可見,則可見吸氣器將返回false。

+0

這通常是正確的,但不能保證 - 它嚴格地回退到其父級的可見性屬性 - 如果其父級是已覆蓋Visible並且不依賴其*父級的自定義控制,則不進一步檢查父級/子級級別會發生。 – 2011-03-03 14:08:32

+0

這並不完全是發生了什麼,但它正是發生了什麼事情。你介意我是否編輯你的答案來提供最終解決方案? – 2011-03-03 14:18:02

+0

@Joel爲什麼不編輯原始問題?國際海事組織將更加可見。 – 2011-03-03 14:21:52

0

是您正在使用的面板還定義可見propery?它可能會影響基類中的Visible屬性,這意味着該面板有2個屬性。一個關於父母,一個關於孩子有不同的價值觀。即
myPanel.Visible =假
myPanel.Base.Visible =真

0

檢查它有任何家長控制是隱藏的,通過粘貼一些代碼將會使事情變得更加清晰。這可能是繼承父財產的問題......但我不確定..直到和除非,代碼有

+0

也許你沒有完全讀過這個問題。我很久以前就把這個解決方案作爲一個編輯發佈了。 – 2011-03-03 15:33:26

相關問題