private void PerformSmartColumnSizing(BeforeSizingOperationDelegate beforeSizingOperation) { _isInternalColumnWidthChange = true; _dataGridView.AutoSizeColumnsMode = (_manualColumnWidths == null) ? DataGridViewAutoSizeColumnsMode.Fill : DataGridViewAutoSizeColumnsMode.None; this.SuspendLayout(); try { if (beforeSizingOperation != null) beforeSizingOperation.Invoke(); if (_manualColumnWidths != null) { int totalColumnWidth = 0; foreach (DataGridViewColumn column in _dataGridView.Columns) totalColumnWidth += column.Visible ? GetManualColumnWidth(column) : 0; float clientAreaWidth = _dataGridView.ClientSize.Width; VScrollBar scrollBar = (VScrollBar) CollectionUtils.SelectFirst(_dataGridView.Controls, c => c is VScrollBar); if (scrollBar != null && scrollBar.Visible) clientAreaWidth -= scrollBar.Width; float widthMultiplier = 1; if (totalColumnWidth < clientAreaWidth) widthMultiplier = (clientAreaWidth)/totalColumnWidth; foreach (DataGridViewColumn column in _dataGridView.Columns) column.Width = (int) (GetManualColumnWidth(column)*widthMultiplier); } } finally { this.ResumeLayout(true); _dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; _isInternalColumnWidthChange = false; } }