2010-11-16 19 views
7

Tengo una vista de cuadrícula de datos que está anclada y anclada con un panel en un formulario de Winform. Cuando cambio el tamaño del formulario, la vista de cuadrícula de datos cambia el tamaño como se esperaba, pero las columnas no cambian de tamaño para ajustarse a la vista de cuadrícula de datos. En cambio, me queda el color de fondo de Datagridview.C# cambiar el tamaño de las columnas de la vista de tabla de datos para ajustar el control

¿Cómo puedo hacer que las columnas crezcan con el control?

Gracias.

Respuesta

6
private void dataGrid_SizeChanged(object sender, EventArgs e) 
{ 
    ResizeGridColumns(); 
} 

private void ResizeGridColumns() 
{ 
    //get sum of non-resizable columns width 
    int diffWidth = 0; 
    foreach (DataGridViewColumn col in this.dataGrid.Columns) 
    { 
     if (col.Resizable == DataGridViewTriState.False && col.Visible) diffWidth += col.Width; 
    } 

    //calculate available width 
    int totalResizableWith = this.dataGrid.Width - diffWidth; 

    //resize column width based on previous proportions 
    this.dataGrid.ColumnWidthChanged -= new DataGridViewColumnEventHandler(dataGrid_ColumnWidthChanged); 
    for (int i = 0; i < this.colWidthRaport.Count; i++) 
    { 
     try 
     { 
      if (this.dataGrid.Columns[i].Resizable != DataGridViewTriState.False && this.dataGrid.Columns[i].Visible) 
      { 
       this.dataGrid.Columns[i].Width = (int)Math.Floor((decimal)totalResizableWith/this.colWidthRaport[i]); 
      } 
     } 
     catch { } 
    } 
    this.dataGrid.ColumnWidthChanged += new DataGridViewColumnEventHandler(dataGrid_ColumnWidthChanged); 
} 

private void dataGrid_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e) 
{ 
    CalculateGridColWidthsRaport(); 
} 

/// <summary>Calculates the proportions between grid width and column width</summary> 
private void CalculateGridColWidthsRaport() 
{ 
    //get sum of non-resizable columns width 
    int diffWidth = 0; 
    int colWidthsSum = 0; 
    foreach (DataGridViewColumn col in this.dataGrid.Columns) 
    { 
     if (col.Visible) 
     { 
      colWidthsSum += col.Width; 
      if (col.Resizable == DataGridViewTriState.False) diffWidth += col.Width; 
     } 
    } 
    colWidthsSum += 24; 

    //calculate available with 
    int totalResizableWith = colWidthsSum - diffWidth;// this.dataGrid.Width - diffWidth; 
    if (this.ParentForm.WindowState == FormWindowState.Maximized) 
    { 
     totalResizableWith = this.dataGrid.Width - diffWidth; 
    } 

    //calculate proportions of each column relative to the available width 
    this.colWidthRaport = new List<decimal>(); 
    foreach (DataGridViewColumn col in this.dataGrid.Columns) 
    { 
     this.colWidthRaport.Add((decimal)totalResizableWith/(decimal)col.Width); 
    } 
} 
+0

Gracias. He usado eventos y funciona bien. –

10

Puede configurar AutoSizeMode propiedad de una de las columnas para ser Fill. Entonces, esta columna siempre se redimensionará para llenar todo el espacio disponible no utilizado por otras columnas.

11

usted podría utilizar siempre la propiedad AutoSizeColumnsMode

Esta propiedad le permite configurar el control para que los anchos de columna se ajustan automáticamente, ya sea para llenar el control o para adaptarse contenido de la celda. Los ajustes de tamaño ocurren en el modo de relleno cada vez que cambia el ancho del control.

Hay mucha más información en la página de MSDN para esto.

Cuestiones relacionadas