2010-11-16 9 views
7

Ho una vista datagrid che è ancorata e ancorata con un pannello su un Winform. Quando ridimensiono il modulo, la vista datagrid si ridimensiona come previsto, ma le colonne non vengono ridimensionate per adattarsi alla vista dati. Invece, mi rimane il colore di sfondo di Datagridview.C# ridimensiona colonne DataGridView per adattarsi al controllo

Come posso far crescere le colonne con il controllo?

Grazie.

risposta

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

Grazie. Ho usato eventi e funziona bene. –

10

È possibile impostare AutoSizeMode proprietà di una delle colonne di essere Fill. Quindi questa colonna verrà sempre ridimensionata per riempire tutto lo spazio disponibile non utilizzato da altre colonne.

11

Si può sempre utilizzare la proprietà AutoSizeColumnsMode

Questa proprietà consente di configurare il controllo in modo che la larghezza delle colonne vengono regolati automaticamente o per riempire il controllo o per adattare il contenuto delle celle. Le regolazioni delle dimensioni si verificano in modalità riempimento ogni volta che cambia la larghezza del controllo.

Ci sono molte più informazioni sulla pagina MSDN per questo.

Problemi correlati