.net 如何以编程方式调整PropertyGrid控件的水平分隔符?

5kgi1eie  于 2023-01-18  发布在  .NET
关注(0)|答案(4)|浏览(210)

我在C#项目中使用.NET PropertyGrid控件。
当包含网格的窗体加载时,水平拆分器(将设置与描述分开)处于默认位置。如何在C#中以编程方式更改该拆分器的位置?

ffx8fchx

ffx8fchx1#

此代码基于The Code Project中的一篇文章(http://www.codeproject.com/KB/grid/GridDescriptionHeight.aspx),其中引入了两个修复和一些清理。

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

我在自己的项目中使用过对你来说应该没问题。

1cklez4t

1cklez4t2#

您不能使用PropertyGrid控件公开的公共方法和属性来执行此操作,或者至少我找不到任何有用的东西。
您可以尝试使用反射来获取显示设置或说明的属性网格的子控件,并尝试以编程方式设置它们的高度;我猜拆分器只是停靠,设置它的位置不会改变任何东西。
使用调试器查看PropertyGrid的非公共成员应有助于您了解控件的内部结构。

1yjd4xko

1yjd4xko3#

这里是Matthew Ferreira在VB .NET中的解决方案。谢谢Matthew,工作很愉快!

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
yduiuuwa

yduiuuwa4#

我必须做一些调整才能让它工作。下面的代码适用于.NET 6:

public static class PropertyGridExtensions {
    public static void ResizeDescriptionArea(this PropertyGrid grid, int lineCount) {
        var helpControl = grid.Controls[0];
        var helpControlType = helpControl.GetType();

        const BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
        helpControlType.GetProperty("Lines")?.SetValue(helpControl, lineCount);
        helpControlType.BaseType!.GetProperty("UserSized", bindingFlags)!.SetValue(helpControl, true);

        grid.HelpVisible = true;
    }
}

相关问题