Как программно настроить горизонтальный разделитель элемента управления PropertyGrid? - PullRequest
3 голосов
/ 12 февраля 2010

Я использую элемент управления .NET PropertyGrid в своем проекте C #.

Когда форма, содержащая сетку, загружается, горизонтальный разделитель (который отделяет параметры настройки от описания) находится в положении по умолчанию. Как программно изменить положение этого разделителя в C #?

Ответы [ 3 ]

8 голосов
/ 12 февраля 2010

Этот код основан на статье (http://www.codeproject.com/KB/grid/GridDescriptionHeight.aspx) из The Code Project, с двумя исправлениями и внесением некоторой очистки.

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);
    }
}

Я использовал это в своих собственных проектах; он должен нормально работать для вас.

0 голосов
/ 01 марта 2013

А вот решение Мэтью Феррейры в VB.Net. Спасибо Мэтью, работает удовольствие!

    Imports System.Reflection

    Public Sub ResizeDescriptionArea(grid As PropertyGrid, lines As Integer)
        Try
            Dim info = grid.[GetType]().GetProperty("Controls")
            Dim collection = DirectCast(info.GetValue(grid, Nothing), Control.ControlCollection)

            For Each control As Object In collection
                Dim type = control.[GetType]()

                If "DocComment" = type.Name Then
                    Const Flags As BindingFlags = BindingFlags.Instance Or BindingFlags.NonPublic
                    Dim field = type.BaseType.GetField("userSized", Flags)
                    field.SetValue(control, True)

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

                    grid.HelpVisible = True
                    Exit For
                End If
            Next

        Catch ex As Exception
            Trace.WriteLine(ex)
        End Try
    End Sub
0 голосов
/ 12 февраля 2010

Вы не можете сделать это с открытыми методами и свойствами, предоставляемыми элементом управления PropertyGrid, или, по крайней мере, я не смог найти ничего полезного.
Вы можете попытаться использовать отражение, чтобы получить подэлементы управления сеткой свойств, которые отображают настройки или описание, и попытаться установить их высоту программно; Я полагаю, что сплиттер просто пристыкован, и установка его положения ничего не изменит.
Просмотр непубличных членов PropertyGrid с помощью отладчика должен помочь вам узнать о внутренней структуре элемента управления.

...