2009-10-22 84 views
9

Tengo un Formulario y un DataGridView. Rellenar DataGridView en tiempo de ejecución, por lo que quiero saber cómo cambiar el tamaño del formulario de forma dinámica de acuerdo con el tamaño de DataGridView? ¿Hay algún tipo de propiedad o método? ¿O tengo que determinar el tamaño yo mismo y actualizar en consecuencia?C# Auto Resize Form al tamaño de DataGridView

+0

¿Cómo se "determinan el tamaño de mi mismo", por favor? Solo necesito saber cuántos píxeles quiere "DGV". (Puedo establecer límites razonables para evitar que el formulario se vuelva demasiado grande). – billpg

Respuesta

3

Normalmente, los controles adaptan sus tamaños al tamaño del formulario que los contiene. Para ajustar el tamaño de su formulario al tamaño de su DataGridView, usted do tiene que determinar el tamaño usted mismo y luego establecer el tamaño del formulario para que coincida, recordando tener en cuenta el tamaño adicional requerido por la banda de menú del formulario y/o barras de herramientas, barras de estado u otros controles.

En su caso, probablemente sería mejor no cambiar el tamaño del formulario para que coincida con el control de vista de cuadrícula. Lo más probable es que tenga muchas más filas en la vista de cuadrícula que las que caben en su pantalla de Windows, y no desea tener un formulario que se extienda debajo del área de escritorio visible. En términos generales, este tipo de situación es exactamente la razón por la que desea tener una vista de cuadrícula desplazable: para ver más datos de los que pueden caber en la pantalla a la vez.

+2

"Para ajustar el tamaño de su formulario al tamaño de su DataGridView, usted mismo debe determinar el tamaño" ¿Hay alguna manera de hacerlo? ¿Por favor? My DataGridView solo tiene algunas celdas y solo lectura. Cambiar el tamaño de la forma para que quepa no es ningún problema, excepto que no sé cuántos píxeles necesita la DGV. Muchas gracias. – billpg

6

Puede encontrar el ancho real por el ancho de Columnas de conteo.

No olvide que su formulario puede ser más complejo y debe contar con otros controles.

public class YourForm : Form 
{ 
    public YourForm() 
    { 
     DataGridView _dgv = new DataGridView() { Dock = DockStyle.Fill}; 
     Controls.Add(_dgv); 
    } 
    public void CorrectWindowSize() 
    { 
     int width = WinObjFunctions.CountGridWidth(_dgv); 
     ClientSize = new Size(width, ClientSize.Height); 
    } 
    DataGridView _dgv; 
} 

public static class WinObjFunctions 
{ 
    public static int CountGridWidth(DataGridView dgv) 
    { 
     int width = 0; 
     foreach (DataGridViewColumn column in dgv.Columns) 
      if (column.Visible == true) 
       width += column.Width; 
     return width += 20; 
    } 
} 
1

Iría en la otra dirección y dimensionaría la cuadrícula al formulario. (algunos usuarios pueden tener baja resolución) Establezca la propiedad 'WindowState' de la forma => maximizada. (opcional) Establezca la propiedad 'ancla' de DGV => 'Arriba, abajo, izquierda, derecha'.

1

Puede hacer uso de la propiedad PreferredSize (MSDN PreferredSize entry). Para los controles DataGridView, encontré que el ancho y la altura preferidos eran aproximadamente 20 unidades más grandes de lo que esperaba. Supongo que el control podría estar calculando su tamaño preferido teniendo en cuenta las barras de desplazamiento.

Otra advertencia que descubrí es que el cálculo PreferredSize no será preciso inmediatamente después de agregar o cambiar elementos en la tabla. Para evitar esto hice un controlador para el evento RowHeadersWidthChanged.

Esto es lo que funcionó para mí:

class GridToy { 
    private DataGridView grid; 
    public GridToy(DataGridView dgv) { 
     grid = dgv; 
     grid.RowHeadersWidthChanged += AdjustWidth; // Event handler. 
     Layout(); 
    } 

    public void Layout() { 
     // Just do some arbitrary manipulation of the grid. 
     grid.TopLeftHeaderCell.Value = "Some Arbitrary Title"; 
    } 

    public void AdjustWidth() { 
     Control horizontal = grid.Controls[0]; // Horizontal scroll bar. 
     Control vertical = grid.Controls[1]; // Vertical scroll bar. 
     grid.Width = grid.PreferredSize.Width - vertical.Width + 1; 
     grid.Height = grid.PreferredSize.Height - horizontal.Height + 1; 
    } 
} 
+0

No estoy seguro de si RowHeadersWidthChanged es el mejor evento para escuchar, pero parece hacer el trabajo. – amacleod

+0

Hmm. La experimentación adicional revela que 'PreferredSize' también tiene en cuenta el ancho de los encabezados de fila, incluso si' RowHeadersVisible' es falso. Parece que juntar el tamaño de la suma a mano será más confiable. – amacleod

-1

dataGridView1.AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);

Espero que esto ayude :)

2
int dgv_width = dataGridView1.Columns.GetColumnsWidth(DataGridViewElementStates.Visible); 
int dgv_height = dataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.Visible); 
this.Width = dgv_width; 
this.Height = dgv_height; 

this.Width cambia el tamaño de este ancho de formularios.

Por supuesto, debe agregar valores fijos (por ejemplo, margen, longitud del título del formulario, ecc). Con las pruebas que he alcanzado los valores de trabajo para mí (no pregunte por qué ...):

this.Width = dgv_width + 147; 
this.Height = dgv_height + 47; 
0

También podemos establecer la "altura" de la propiedad de automóviles en la forma después de clasificar o el uso de un ID y esto debería hacerlo,

Acabo de intentarlo ...Y funcionó

#form1{ 
background-color:white; 
height:auto;        
width:1500px;    
border-top:medium solid #3399FF; 
margin-top:100px; 
margin-left:30px; 
display: inline-block; 
text-align: center;     
float: none;  
} 

Sólo estoy poniendo exactamente lo que hice en caso de que se perdió .. No se preocupe por las otras propiedades allí para mi diseño.

-1

Conjunto AutoSizeColumnsMode :Fill en Propiedades de cuadrícula