Live Chat Icon For mobile
Live Chat Icon

How can I autosize the rowheights in my datagrid

Platform: WinForms| Category: Datagrid

Here is a solution suggested by Matthew Benedict. It uses reflection to access the protected DataGridRows collection so he can
set the row height.

               public void AutoSizeGrid() 
                        // DataGrid should be bound to a DataTable for this part to 
                        // work. 
                        int numRows = ((DataTable)gridTasks.DataSource).Rows.Count; 
                        Graphics g = Graphics.FromHwnd(gridTasks.Handle); 
                        StringFormat sf = new StringFormat(StringFormat.GenericTypographic); 
                        SizeF size; 

                        // Since DataGridRows[] is not exposed directly by the DataGrid 
                        // we use reflection to hack internally to it.. There is actually 
                        // a method get_DataGridRows that returns the collection of rows 
                        // that is what we are doing here, and casting it to a System.Array 
                        MethodInfo mi = gridTasks.GetType().GetMethod('get_DataGridRows',
                                                  BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase | BindingFlags.Instance
                                                  | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);

                        System.Array dgra = (System.Array)mi.Invoke(gridTasks,null); 

                        // Convert this to an ArrayList, little bit easier to deal with 
                        // that way, plus we can strip out the newrow row. 
                        ArrayList DataGridRows = new ArrayList(); 
                        foreach (object dgrr in dgra) 
                                if (dgrr.ToString().EndsWith('DataGridRelationshipRow')==true) 

                        // Now loop through all the rows in the grid 
                        for (int i = 0; i < numRows; ++i) 
                                // Here we are telling it that the column width is set to 
                                // 400.. so size will contain the Height it needs to be. 
                                size = g.MeasureString(gridTasks[i,1].ToString(),gridTasks.Font,400,sf); 
                                int h = Convert.ToInt32(size.Height); 
                                // Little extra cellpadding space 
                                h = h + 8; 

                                // Now we pick that row out of the DataGridRows[] Array 
                                // that we have and set it’s Height property to what we 
                                // think it should be. 
                                PropertyInfo pi = DataGridRows[i].GetType().GetProperty('Height'); 

                                // I have read here that after you set the Height in this manner that you should 
                                // Call the DataGrid Invalidate() method, but I haven’t seen any prob with not calling it..



Share with

Share on twitter
Share on facebook
Share on linkedin

Related FAQs

Couldn't find the FAQs you're looking for?

Please submit your question and answer.