Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I determine visibility of a control?

I have a TabControl that contains several tabs. Each tab has one UserControl on it. I would like to check the visibility of a control x on UserControl A from UserControl B. I figured that doing x.Visible from UserControl B would be good enough. As it turns out, it was displaying false in the debugger even though I set it explicitly to true and it was never changed. Then I read on MSDN for Control.Visible that:

Even if Visible is set to true, the control might not be visible to the user if it is obscured behind other controls.

So much to my surprise, that will not work. Now I'm wondering how I can tell if the control x is visible from a different UserControl. I would like to avoid using a boolean if possible. Has anyone run into this and found a solution?

Note: It also appears that Control.IsAccessible is false in this situation.

like image 720
SwDevMan81 Avatar asked May 12 '11 15:05

SwDevMan81


2 Answers

Unfortunately the control doesn't provide anything public that will allow you to check this.

One possibility would be to set something in the controls 'Tag' property. The tag’s purpose is to associate user data with the control. So it can be anything not just a boolean.

Here is the Tag property doc

If you really want the brute force way, you can use Reflection, basically calling 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 }));
}
like image 103
Liz Avatar answered Nov 17 '22 17:11

Liz


Please try this:

bool ControlIsReallyVisible(Control C)
{
    if (C.Parent == null) return C.Visible;
    else return (C.Visible && ControlIsReallyVisible(C.Parent));
}
like image 1
Daniel Mošmondor Avatar answered Nov 17 '22 17:11

Daniel Mošmondor