form example ejemplos editar datos agregar c# datagridview height autosize

c# - example - winforms: datagridview: height(autosize) dependiendo del número de filas



datagridview size (3)

en uno de mis formularios, una vista de malla de datos muestra datos de una base de datos (por supuesto, la cantidad de datos (por lo tanto, el número de filas) puede cambiar). La conexión de la base de datos está en el evento de carga de formulario. Simplemente no puedo entender cómo se autoescala la altura de toda la vista de cuadro de datos, dependiendo del número de filas que muestra.


Si configura DataGridView.AutoSize == verdadero, a medida que agrega más filas, la cuadrícula se alarga. De lo contrario, obtienes barras de desplazamiento. A menos que hayas establecido ScrollBars == Null || Horizontal, en cuyo caso las filas simplemente desaparecen del extremo.

Por alguna razón, DataGridView.AutoSize solo se puede establecer mediante programación. Y se observan algunos comportamientos extraños cuando se coloca la cuadrícula dentro de un control autosizable. No parece responder al tamaño de la grilla.

Terminé calculando el tamaño esperado de la grilla de la columna, fila, encabezado, margen, relleno y tamaños de borde, y luego dimensionando el control que contiene la grilla y anclando la grilla en cuatro lados. Me sentí muy torpe, pero es lo mejor que pude hacer. Si todavía estás cerca, comenta y veré si puedo encontrar el código, no lo tengo a la mano.


Esto es lo que logré encontrar, y funciona bien hasta ahora:

int GetDataGridViewHeight(DataGridView dataGridView) { var sum = (dataGridView.ColumnHeadersVisible ? dataGridView.ColumnHeadersHeight : 0) + dataGridView.Rows.OfType<DataGridViewRow>().Where(r => r.Visible).Sum(r => r.Height); return sum; }

Gracias a esto, encapsulé mi DataGridView en un UserControl para poder implementar AutoSize correctamente:

// This is in a user control where the datagrid is inside (Top docked) protected override void OnResize(EventArgs e) { if (AutoSize) { var height = this.GetDataGridViewHeight(this.dataBoxGridView); this.dataBoxGridView.Height = height; this.Height = height +this.Padding.Top + this.Padding.Bottom; } }

No intenté (aún) construir un control personalizado directamente desde DataGridView para implementar esto.