2011-03-03 3 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"가 표시됩니다.

공동 작업자는 getter에서 Panel.Visible 블랙 박스 코드가 할당을 허용하지만 일부 부모 개체가 (코드 실행의 해당 시점에서) False로 설정되어 있으므로 false를 반환하는 것이 가능하다고 제안했습니다. 부모 개체를 검토 한 결과 어떤 개체도 보이지 않도록 설정되어있는 것으로 보입니다.

이것이 참조 유형이라면 다른 어떤 프로세스가이 지정과 실제로 (Render에서) 사용되었을 때 참조를 수정하는 것으로 확신 할 수 있습니다. 그러나이 코드 라인에서 바로 발생합니다.

이 부울 할당이 예외를 발생시키지 않고 이런 식으로 행동하게하는 원인은 무엇입니까?

솔루션 :
대답은 사용자 정의 컨트롤 외부에있는 컨트롤 계층에서 부모 개체로 밝혀졌습니다. 아무 것도 명시 적으로 false로 설정되었으므로 @Damien_The_Unbeliever 및 @ CodeMonkey1과 같은 @Shadow Wizard와 동의 했으므로 패널의 외부 컨트롤에 영향을 미쳐야하므로 재귀 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 값을 반환합니다.

나머지 할당은 그 시점부터 예상대로 작동합니다. 그 순간에 pnlAddComment에 대한 적절한 표시 설정이 false이기 때문에 lblRating 컨트롤은 false (영구적으로)로 설정됩니다. 여기서 배운 교훈은 대안적인 (그리고 아주 간단한 것처럼) 방법이있을 때 이런 방식으로 서로에게 통제의 가시성을 의존시키지 말아야한다는 것입니다.

+0

이것은 .NET 동작에 의해 설명 될 수 없으므로, 그것은'IsAgent()'메소드의 코드로 무언가 여야합니다 - 여기에 게시하면 우리가 보게 될 것입니다. 예를 들어 반환 값을 "토글"할 수도 있습니다 - 첫 번째 호출은 True, 두 번째 호출은 False 등을 반환합니다. –

+0

@Joel 또 다른 아이디어 - 반환 값을 변수로 먼저 설정하면 'Dim blnIsAgent As Boolean = MyBase.Associate .IsAgent()'어떻게됩니까? 뭐가 달라? –

+0

@Shadow Wizard : 실제 코드가 없습니다. username 변수는 쿠키 값으로 채워집니다. 이 문자열은'OrElse'에 의해 분리 된 2 개의'Contains' 호출로 테스트됩니다. 어쨌든, 그것은 사실로 적절하게 평가됩니다. 문제는 왜 패널의 가시적 인 속성이 할당에 따라 같은 것으로 평가되지 않는 이유입니까? –

답변

2

Visible getter는 컨트롤의 조상 중 하나가 보이지 않으면 false를 반환합니다.

+0

일반적으로 true이지만 보장 할 수는 없습니다. 부모가 Visible 속성으로 엄격하게 되돌아갑니다. 부모가 Visible을 재정의하고 해당 부모에 의존하지 않는 사용자 정의 컨트롤 인 경우 상위/하위 계층을 더 이상 확인하지 않습니다. 일어날 것이다. –

+0

이것은 정확히 무슨 일이 벌어지는 것이 아니라 정확히 무슨 일이 벌어지고 있는지입니다.궁극적 인 해결책을 제공하기 위해 답을 편집해도 되겠습니까? –

+0

@Joel 왜 원래 질문을 편집하지 않습니까? IMO가 눈에 잘.니다. –

0

은 Visible 속성을 정의하는 데 사용하는 패널입니까? 그것은 아마 기본 클래스의 Visible 속성을 섀도 잉합니다. 즉, 패널에 2 개의 속성이 있음을 의미합니다. 하나는 부모에, 다른 하나는 다른 값을가집니다. 즉
myPanel.Visible = 거짓
myPanel.Base.Visible = 진정한

0

그것을가 일을 더 명확하게 몇 가지 코드를 붙여, 숨겨진 어떤 부모 컨트롤을했다 확인하십시오. 상속 재산의 문제일지도 모르지만 ... 나는 잘 모르겠다.때까지 코드는 거기에

+0

아마도이 질문을 완전히 읽지는 않았을 것입니다. 나는 꽤 오랜 전에 편집으로 해결책을 게시했다. –

관련 문제