Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the "real" value of the Visible property?

If you set the Visible property of a Windows Forms control to true, that property still returns false if any of the control's parent windows are hidden. Is there a way to get the true, underlying visibility flag of the control in case the parent window is hidden?

like image 233
Qwertie Avatar asked Dec 24 '08 17:12

Qwertie


2 Answers

Well, the regular implementation does check up the control stack, to ensure that all parents are visible. The only way I know to dodge this is to cheat with reflection, and ask for GetState(2), but that is brittle:

    // dodgy; not recommended
    Panel query;
    Form form = new Form
    {
        Controls = {
            new Panel {
                Visible = false,
                Controls = {
                    (query = new Panel {Visible = true})
                }
            }
        }
    };
    form.Show();

    // this is the dodgy bit...
    bool visible = (bool)typeof(Control)
        .GetMethod("GetState", BindingFlags.Instance | BindingFlags.NonPublic)
        .Invoke(query, new object[] { 2 });
like image 180
Marc Gravell Avatar answered Nov 15 '22 20:11

Marc Gravell


What I did is temporarily remove the button from its parent controls to check its Visible value and then re-add to the parent controls.

If you need you can track the child index to re-add it at the right index.

like image 29
Tuan-Tu Avatar answered Nov 15 '22 21:11

Tuan-Tu