5

WinForms ( http://msdn.microsoft.com/en-us/library/aa302326.aspx ) に PropertyGrid コントロールがあります。ここで、中央の垂直線をもっと左に移動したいと思います (常に中央に配置されますが、キーは非常に短く、値は長いパスです。コントロールはデフォルトで線を中央に配置しますが、ユーザーが移動できます。ユーザー フレンドリ性の観点から、プログラムで行をもっと左に移動したいと思います。現在、WinForms デザイナー プロパティと PropertyGrid コントロールのメンバーの両方を複数回検索しましたが、オプションが見つかりませんでした (また、それに関するイベントもありません)。

非公開にすることで、見えない/変更できないように隠されていますか? 私は単にそれを監視しただけですか?(その場合は、誠に申し訳ありません)またはどうすればこれを行うことができますか?

4

2 に答える 2

12

はい、残念ながら、これを達成するには、リフレクションベースのハックが必要です。次に、拡張クラスのサンプルを示します。

PropertyGridExtensionHacks.cs

using System.Reflection;
using System.Windows.Forms;

namespace PropertyGridExtensionHacks
{
    public static class PropertyGridExtensions
    {
        /// <summary>
        /// Gets the (private) PropertyGridView instance.
        /// </summary>
        /// <param name="propertyGrid">The property grid.</param>
        /// <returns>The PropertyGridView instance.</returns>
        private static object GetPropertyGridView(PropertyGrid propertyGrid)
        { 
            //private PropertyGridView GetPropertyGridView();
            //PropertyGridView is an internal class...
            MethodInfo methodInfo = typeof(PropertyGrid).GetMethod("GetPropertyGridView", BindingFlags.NonPublic | BindingFlags.Instance);
            return methodInfo.Invoke(propertyGrid, new object[] {});
        }

        /// <summary>
        /// Gets the width of the left column.
        /// </summary>
        /// <param name="propertyGrid">The property grid.</param>
        /// <returns>
        /// The width of the left column.
        /// </returns>
        public static int GetInternalLabelWidth(this PropertyGrid propertyGrid)
        {
            //System.Windows.Forms.PropertyGridInternal.PropertyGridView
            object gridView = GetPropertyGridView(propertyGrid);

            //protected int InternalLabelWidth
            PropertyInfo propInfo = gridView.GetType().GetProperty("InternalLabelWidth", BindingFlags.NonPublic | BindingFlags.Instance);
            return (int)propInfo.GetValue(gridView);
        }

        /// <summary>
        /// Moves the splitter to the supplied horizontal position.
        /// </summary>
        /// <param name="propertyGrid">The property grid.</param>
        /// <param name="xpos">The horizontal position.</param>
        public static void MoveSplitterTo(this PropertyGrid propertyGrid, int xpos)
        {
            //System.Windows.Forms.PropertyGridInternal.PropertyGridView
            object gridView = GetPropertyGridView(propertyGrid);

            //private void MoveSplitterTo(int xpos);
            MethodInfo methodInfo = gridView.GetType().GetMethod("MoveSplitterTo", BindingFlags.NonPublic | BindingFlags.Instance);
            methodInfo.Invoke(gridView, new object[] { xpos });
        }
    }
}

スプリッターの位置を移動するには、MoveSplitterTo拡張メソッドを使用します。GetInternalLabelWidth拡張メソッドを使用して、スプリッターの実際の位置を取得します。SelectedObjectが割り当てられ、PropertyGridが表示されなくなるまで、GetInternalLabelWidthが(-1)を返すことに注意してください。

使用例:

using PropertyGridExtensionHacks;
//...

    private void buttonMoveSplitter_Click(object sender, EventArgs e)
    {
        int splitterPosition = this.propertyGrid1.GetInternalLabelWidth();
        this.propertyGrid1.MoveSplitterTo(splitterPosition + 10);
    }
于 2013-03-12T17:08:47.900 に答える