2011-05-12 76 views
8

我有一個TabControl包含幾個選項卡。每個標籤上有一個UserControl。我想檢查從UserControlBUserControlA控制x的可見性。我認爲從UserControlBx.Visible就足夠了。事實證明,它在調試器中顯示false,即使我將其明確設置爲true並且它從未更改過。然後,我在MSDN上閱讀Control.Visible是:如何確定控件的可見性?

即使可見設置爲true,則控制可能不會,如果是落後於其他控制模糊可見給用戶。

這麼多令我驚訝的是,這是行不通的。現在我想知道如何從不同的UserControl看到控制器x是否可見。如果可能,我想避免使用布爾值。有沒有人遇到這個,並找到了解決方案?

注意:在這種情況下,Control.IsAccessible也是錯誤的。

+0

你有沒有嘗試在容器層次結構中升序並且如果它們中的任何一個不可見,則確定不可見? – 2011-05-12 15:53:32

+0

是的,所有的父級控件一直都有'Visible'屬性設置爲'false'。 – SwDevMan81 2011-05-12 16:01:50

+0

所以你不可見,我正確嗎? – 2011-05-12 16:19:27

回答

7

不幸的是,該控件沒有提供任何公開的內容,允許您檢查該內容。

一種可能性是在控件的'標籤'屬性中設置一些東西。標籤的目的是將用戶數據與控件相關聯。所以它可以是任何不只是布爾值。

Here is the Tag property doc

如果你真的想蠻力的方式,你可以使用反射,基本上調用GETSTATE(2):

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 2011-05-12 15:49:10

0

請試試這個:

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

這將始終返回true – SwDevMan81 2011-05-12 20:44:32

+0

是 - 這是更正 – 2011-05-12 21:44:35

+0

此解決方案對我無效。始終返回true。 – 2015-12-04 16:03:33

相關問題