2011-05-12 6 views
8

나는 여러 개의 탭이 포함 된 TabControl이 있습니다. 각 탭에는 하나의 UserControl이 있습니다. 컨트롤의 가시성을 UserControlAUserControlB에서 확인하고 싶습니다. 나는 x.VisibleUserControlB에서 수행하는 것으로 충분하다고 생각했습니다. 그것이 명시 적으로 true으로 설정 되었는데도 변경되지 않았 더라면, 디버거에 false이 표시되었습니다. 심지어 true로 설정되어 보이는 경우가 다른 컨트롤 뒤에 가려진 경우 컨트롤의 가시성을 어떻게 결정합니까?

이 컨트롤이 사용자에게 표시되지 않을 수도 있습니다 : 그럼 난 것을 Control.Visible에 대한 MSDN에서 읽을.

너무 놀랍게도 작동하지 않습니다. 이제 x 컨트롤이 다른 UserControl에서 볼 수 있는지 어떻게 알 수 있는지 궁금합니다. 가능한 경우 부울을 사용하지 않는 것이 좋습니다. 아무도 이것에 뛰어 들어 해결책을 찾지 못했습니까?

참고 :이 경우 Control.IsAccessible이 false 인 것 같습니다.

+0

당신이 시도해 봤어 당신이 정말로 무력 방법을 원하는 경우에

Here is the Tag property doc

, 당신은 기본적으로 다시 GetState (2)를 호출, 반사를 사용할 수 있습니다 컨테이너 계층 구조에서 오름차순으로 표시되며 보이지 않는 항목이 있으면 보이지 않는 것으로 결정할 수 있습니까? –

+0

예, 모든 부모 컨트롤은 'Visible' 속성이'false '로 설정되어 있습니다. – SwDevMan81

+0

너는 보이지 않는다. 내가 맞습니까? –

답변

7

불행히도 컨트롤은이를 확인하는 데 사용할 수있는 공개 정보를 제공하지 않습니다.

한 가지 가능성은 컨트롤 '태그'속성에 무엇인가를 설정하는 것입니다. 태그의 목적은 사용자 데이터를 컨트롤과 연결하는 것입니다. 그래서 그것은 단지 부울이 될 수 있습니다.

public static bool WouldBeVisible(Control ctl) 
{ 
     // Returns true if the control would be visible if container is visible 
     MethodInfo mi = ctl.GetType().GetMethod("GetState", BindingFlags.Instance | BindingFlags.NonPublic); 
     if (mi == null) return ctl.Visible; 
     return (bool)(mi.Invoke(ctl, new object[] { 2 })); 
} 
+0

+1 잘 찾았습니다. nobugz (일명 Hans Passant)와 비슷한 모양이 http://social.msdn.microsoft.com/Forums/en/winforms/thread/e2e681ef-94d2-4eb3-b9a4-4e20a49afae0에 게시되었습니다. 답변 해주셔서 감사합니다! – SwDevMan81

0

이 시도하십시오 :

bool ControlIsReallyVisible(Control C) 
{ 
    if (C.Parent == null) return C.Visible; 
    else return (C.Visible && ControlIsReallyVisible(C.Parent)); 
} 
+0

이것은 항상 true를 반환합니다. – SwDevMan81

+0

예 - 여기는 수정입니다 –

+0

이 솔루션은 저에게 효과적이지 않았습니다. 항상 true를 반환합니다. –

관련 문제