我有一個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。我在這裏學到的教訓不是使控制可見性以這種方式依賴於彼此,而是有一種替代方法(以及簡單的方法)。
這不能由.NET行爲解釋,所以它必須是'IsAgent()'方法的代碼的東西 - 在這裏發佈,我們會看到。例如,它可能會「切換」它的返回值 - 第一次調用返回「真」,第二次調用返回「假」等 – 2011-03-03 13:48:36
@Joel另一個想法 - 如果你設置返回值爲變量第一'昏暗blnIsAgent作爲布爾= MyBase.Associate .IsAgent()會發生什麼?有什麼不同? – 2011-03-03 13:50:20
@Shadow Wizard:其中沒有任何真實的代碼。用戶名變量由cookie值填充。然後用2個由'OrElse'分隔的'Contains'調用來測試這個字符串。無論如何,它的評估都是正確的。問題是,爲什麼專家組的可見屬性在給定賦值的情況下評估不一樣? – 2011-03-03 13:51:33