2012-07-26 12 views
5

Tengo un DataGridView que muestra un número limitado de filas, nunca más de 5. Este DataGridView se coloca en un control DataRepeater por lo que generalmente se muestra muchos veces en la pantalla. Lo que quiero lograr es que todas las cuadrículas cambien de tamaño según el tamaño de sus contenidos, de modo que no muestren barras de desplazamiento si hay 4 o 5 elementos en ellas o ocupen espacio vertical adicional si solo hay 1 o 2 elementos allí.Cómo verticalizar automáticamente el tamaño de un control winform datagridview, para que sus filas estén siempre visibles

Las rejillas solo contienen datos de texto. Son controles vinculados a datos, por lo que tendrán que cambiar el tamaño si la fuente de datos subyacente cambia (creo que el evento DataBindingComplete sería adecuado).

¿Cómo puedo lograr esto? ¿Es contar las filas la mejor opción? Gracias por adelantado.

+0

Aquí es una respuesta más precisa [DataGridView Altura automática -? Cómo autoSize DataGridView Altura] (http://stackoverflow.com/questions/38816425/datagridview-auto-height-how-to-autosize-datagridview -altura) –

Respuesta

13

Debido a que su control es enlazado a datos, me gustaría establecer la propiedad Height en el DataGridView a la suma de las alturas de sus filas (más algún margen) en el caso DataBindingComplete:

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    var height = 40; 
    foreach (DataGridViewRow dr in dataGridView1.Rows) { 
     height += dr.Height; 
    } 

    dataGridView1.Height = height; 
} 
0

Este valor puede ser cualquier cosa Debería probar en su grilla para descubrir cuál es el mejor valor para establecer la altura.

var height = 40; 

Editado:

Para hallar el valor real de la altura, es necesario añadir la ubicación de rejilla y altura de cabecera. Algo como eso.

int height = dgv.Location.Y + dgv.ColumnHeadersHeight; 
foreach (DataGridViewRow dr in dgv.Rows) { 
    height += dr.Height; // Row height. 
} 
dgv.Height = height; 
0

Tomé la respuesta de hmqcnoesy y la amplié y creé una función para incluir también el ancho. Y para usar en cualquier cuadrícula.

Nota: Establezca AutoSizeCells = AllCells en la cuadrícula.

public static DataGridView SetGridHeightWidth(DataGridView grd, int maxHeight, int maxWidth) 
    { 
     var height = 40; 
     foreach (DataGridViewRow row in grd.Rows) 
     { 
      if(row.Visible) 
       height += row.Height; 
     } 

     if (height > maxHeight) 
      height = maxHeight; 

     grd.Height = height; 

     var width = 60; 
     foreach (DataGridViewColumn col in grd.Columns) 
     { 
      if (col.Visible) 
       width += col.Width; 
     } 

     if (width > maxWidth) 
      width = maxWidth; 

     grd.Width = width; 

     return grd; 
    } 
Cuestiones relacionadas