views:

363

answers:

2

I am using a .NET PropertyGrid control in my C# project.

When the form containing the grid loads, the horizontal splitter (which divides the Settings from the Description) is at a default position. How do I change the position of that splitter programmatically in C#?

A: 

You cannot do that with the public methods and properties exposed by the PropertyGrid control, or at least I couldn't find anything useful.
You might try to use reflection to get the sub-controls of the property grid that display the settings or the description, and try to set their height programmatically; I guess that the splitter is just docked, and setting it position would not change anything.
Looking at the PropertyGrid's non-public members with the debugger should help you find out about the internal structure of the control.

Paolo Tedesco
+5  A: 

This code is based off of an article (http://www.codeproject.com/KB/grid/GridDescriptionHeight.aspx) from The Code Project, with two fixes and some cleanup introduced.

private void ResizeDescriptionArea(PropertyGrid grid, int lines)
{
    try
    {
        var info = grid.GetType().GetProperty("Controls");
        var collection = (Control.ControlCollection)info.GetValue(grid, null);

        foreach (var control in collection)
        {
            var type = control.GetType();

            if ("DocComment" == type.Name)
            {
                const BindingFlags Flags = BindingFlags.Instance | BindingFlags.NonPublic;
                var field = type.BaseType.GetField("userSized", Flags);
                field.SetValue(control, true);

                info = type.GetProperty("Lines");
                info.SetValue(control, lines, null);

                grid.HelpVisible = true;
                break;
            }
        }
    }

    catch (Exception ex)
    {
        Trace.WriteLine(ex);
    }
}

I've used it in my own projects; it should work fine for you.

Matthew Ferreira
Worked Great. I had to play with the values of Line quite a bit before I could find a good value, it's not really intuitive what Line represents but low numbers <10 seemed to be what I needed
Jordan S
It didn't work for me. It turns out that this code doesn't work until the Form is loaded. Before then, it causes the description area to be zero lines high.
Qwertie
It's been a long time since this question was first asked, but I'm still here to help. I call this function in Form.OnShown. Try it out, it should work in that case.
Matthew Ferreira