rbulph Posted October 18, 2006 Posted October 18, 2006 I find it a bit irritating that the vertical splitter in the propertygrid control is set to the middle of the control initially and also when the user double clicks on it. If the field names are much longer than the values, they may end up partly obscured while the values have more space than necessary. So I thought I'd have a go at fixing this. I've had partial success in this and I thought I'd post the code here in case either it's of use to anyone else or someone can tell me how to fix the problems that I mention in my comments. In the latter case I would be particularly pleased to hear your suggestions. So here it is - you just need a form with a propertygrid control in it. Imports System Imports System.Reflection Imports System.Reflection.Emit Imports Microsoft.VisualBasic Public Class Form1 Private WithEvents g As Control Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load For Each v As Control In Me.PropertyGrid1.Controls If TypeName(v) = "PropertyGridView" Then g = v End If Next setpropgridobject(Me.PropertyGrid1) End Sub Private Sub setpropgridobject(ByVal obj As Object) Me.PropertyGrid1.SelectedObject = obj SetSplitter() End Sub Private Sub g_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles g.DoubleClick 'Problem with this is that the splitter gets set in the middle before being set where I want it, 'and this is visible. If Not g.Cursor Is Cursors.Default Then SetSplitter() End Sub Private Sub GetLongest(ByVal col As Windows.Forms.GridItemCollection, ByRef r As Integer) For Each i As Windows.Forms.GridItem In col r = Math.Max(r, TextRenderer.MeasureText(i.Label, Me.PropertyGrid1.Font).Width) If i.Expanded Then GetLongest(i.GridItems, r) Next End Sub Private Sub SetSplitter() Dim f As Windows.Forms.GridItem = Me.PropertyGrid1.SelectedGridItem Do Until f.Parent Is Nothing f = f.Parent Loop Dim r As Integer GetLongest(f.GridItems, r) Try g.GetType.InvokeMember("MoveSplitterTo", Reflection.BindingFlags.InvokeMethod Or _ Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance, Nothing, g, New Object() {r + 20}) '20 is determined by trial and error, not very good. Catch ex As Exception Debug.Print(ex.ToString) End Try End Sub End Class Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.