una fila columnas cambiar alto ajustar c# winforms datagridview

fila - ajustar columnas datagridview c#



¿Cómo se cambia automáticamente el tamaño de las columnas en un control DataGridView Y permite al usuario cambiar el tamaño de las columnas en esa misma grilla? (21)

Estoy rellenando un control DataGridView en Windows Form (C # 2.0 no WPF).

Mi objetivo es mostrar una cuadrícula que rellene todo el ancho disponible con celdas, es decir, sin áreas no utilizadas (gris oscuro) en la derecha y que dimensione cada columna adecuadamente según los datos que contiene, pero también permite al usuario cambiar el tamaño de cualquiera de las columnas a su gusto

Estoy tratando de lograr esto estableciendo el AutoSizeMode de cada columna para que sea DataGridViewAutoSizeColumnMode.AllCells, excepto una de las columnas que configuré en DataGridViewAutoSizeColumnMode.Fill para asegurar que toda el área de la cuadrícula esté prolijamente llena de datos. (No me importa que cuando el usuario intente cambiar el tamaño de esta columna vuelva a tener un tamaño que asegure que siempre se use el espacio horizontal).

Sin embargo, como mencioné, una vez cargado, me gustaría permitir que el usuario cambie el tamaño de las columnas para satisfacer sus propios requisitos: al configurar estos valores de AutoSizeMode para cada columna, parece que el usuario no puede luego cambiar el tamaño de esas columnas.

Intenté no configurar el AutoSizeMode de todas las columnas, lo que sí permite el cambio de tamaño PERO no establece el tamaño inicial de acuerdo con los datos que contienen las celdas. El mismo resultado se produce al volver a cambiar el modo de tamaño automático de la cuadrícula a "No establecido" después de cargar los datos.

¿Existe una configuración que me falta aquí que permite la configuración automática de anchos de columna predeterminados Y el cambio de tamaño del usuario o hay otra técnica que debo utilizar al llenar el control DataGridView?


¿ FillWeight configurar la propiedad FillWeight de su objeto DataGridViewColumns ?

Por ejemplo:

this.grid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; this.grid1.Columns[0].FillWeight = 1.5;

Creo que debería funcionar en tu caso.


Aquí hay un código simplificado para la respuesta de Miroslav Zadravec en c #:

CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader; for (int i = 0; i < dataGridView1.Columns.Count; i++) dataGridView1.Columns[i].Width = dataGridView1.Columns[i].Width; CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;


Bueno, hice esto así:

dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; dgvReport.AutoResizeColumns(); dgvReport.AllowUserToResizeColumns = true; dgvReport.AllowUserToOrderColumns = true;

en ese orden particular. Las columnas se redimensionan (extendidas) Y el usuario puede cambiar el tamaño de las columnas posteriormente.


Código de C # ligeramente más nítido del código de Miroslav Zadravec suponiendo que todas las columnas se van a auto-dimensionar

for (int i = 0; i < dgvProblems.Columns.Count; i++) { dgvProblems.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; int colw = dgvProblems.Columns[i].Width; dgvProblems.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; dgvProblems.Columns[i].Width = colw; }


Después de agregar los datos a la cuadrícula, agregue el siguiente código que ajustará la columna de acuerdo con la longitud de los datos en cada celda

dataGrid1.AutoResizeColumns(); dataGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

Aquí está el resultado


El ancho de las columnas establecido para ajustarse a su contenido. He utilizado la declaración de abajo. Resolvió mi problema.

Primer paso :

RadGridViewName.AutoSize = true;

Segundo paso :

// This mode fit in the header text and column data for all visible rows. this.grdSpec.MasterTemplate.BestFitColumns();

Tercer paso :

for (int i = 0; i < grdSpec.Columns.Count; i++) { // The column width adjusts to fit the contents all cells in the control. grdSpec.Columns[i].AutoSizeMode = BestFitColumnMode.AllCells; }


En mi aplicación, he establecido

grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

Además, he establecido el

grid.AllowUserToOrderColumns = true; grid.AllowUserToResizeColumns = true;

Ahora se pueden cambiar los anchos de columna y el usuario puede reordenar las columnas. Eso funciona bastante bien para mí.

Quizás eso funcione para ti.


Este truco funciona para mí:

grd.DataSource = DT; //set autosize mode grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; grd.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; grd.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; //datagrid has calculated it''s widths so we can store them for (int i = 0; i <= grd.Columns.Count - 1; i++) { //store autosized widths int colw = grd.Columns[i].Width; //remove autosizing grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; //set width to calculated by autosize grd.Columns[i].Width = colw; }

Lo que sucede aquí es que configuras el autosize en el modo que necesites y luego, columna por columna, almacenas el ancho que obtuvo del cálculo del tamaño automático, eliminas el autosizing y ajustas el ancho al valor que almacenaste antes.


Esto ajusta automáticamente todas las columnas de acuerdo con su contenido, rellena el espacio vacío restante estirando una columna especificada e impide el comportamiento de "saltos" configurando la última columna para que se llene para cualquier redimensionamiento futuro.

// autosize all columns according to their content dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); // make column 1 (or whatever) fill the empty space dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; // remove column 1 autosizing to prevent ''jumping'' behaviour dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; // let the last column fill the empty space when the grid or any column is resized (more natural/expected behaviour) dgv.Columns.GetLastColumn(DataGridViewElementStates.None, DataGridViewElementStates.None).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;


Esto hizo maravillas para mí:

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);


Otra versión del código de Miroslav Zadravec, pero un poco más automatizada y universal:

public Form1() { InitializeComponent(); dataGridView1.DataSource = source; for (int i = 0; i < dataGridView1.Columns.Count - 1; i++) { dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; } dataGridView1.Columns[dataGridView1.Columns.Count].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } void Form1Shown(object sender, EventArgs e) { for ( int i = 0; i < dataGridView1.Columns.Count; i++ ) { int colw = dataGridView1.Columns[i].Width; dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; dataGridView1.Columns[i].Width = colw; } }

Pongo la segunda parte en un evento separado, porque llene datagridvew en la inicialización de formulario y si ambas partes están allí, nada está cambiando, porque probablemente autosize calcule el ancho después de que se muestre datagridview , por lo que los anchos siguen siendo predeterminados en el método Form1() . Después de terminar este método, el autosize hace su truco e inmediatamente después (cuando se muestra el formulario) podemos establecer los anchos por segunda parte del código (aquí en el evento Form1Shown ). Esto funciona para mí como un encanto.


Resumen de la pregunta:
Haga que el ancho de la columna se adapte al contenido (con un método diferente en la columna),
pero luego permite al usuario establecer el ancho de la columna ...

Desarrollado a partir de la respuesta de Miroslav Zadravec , para mí lo que funcionó fue usar inmediatamente la column.Width auto calculada. column.Width para establecer ... column.Width !

foreach (DataGridViewColumn column in dataGridView.Columns) { if (/*It''s not your special column*/) { column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; column.Width = column.Width; //This is important, otherwise the following line will nullify your previous command column.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet; } } //Now do the same using Fill instead of AllCells for your special column

Esto se prueba para que funcione cuando DataGridView ya está creado, usando un truco como this .


Si entendí la pregunta correctamente, debería haber una manera más fácil de lograr lo que necesita. Llame a dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

Eso debería hacer el truco. Sin embargo, hay un inconveniente ya que no puede simplemente llamar a este método directamente después de completar su control DataGridView. En su lugar, deberá agregar un Manejador de eventos para el evento VisibleChanged y llamar al método allí.


Si vincula su fuente de datos a una tabla de datos, por ejemplo, debe configurar las propiedades una vez que finalice la vinculación:

private void dgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; dgv.AutoResizeColumns(); dgv.AllowUserToResizeColumns = true; }



Tuve que hacer esto en VB y prefiero dividirlo en un método que coloqué en un Módulo. Puede agregar la columna Rellenar como otro parámetro ByRef si lo desea.

'''''' <summary> '''''' Makes all columns in a DataGridView autosize based on displayed cells, '''''' while leaving the column widths user-adjustable. '''''' </summary> '''''' <param name="dgv">A DataGridView to adjust</param> Friend Sub MakeAdjustableAutoSizedGridCols(ByRef dgv As DataGridView) Dim width As Integer For Each col As DataGridViewColumn In dgv.Columns col.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells width = col.Width col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None col.Width = width Next dgv.AllowUserToResizeColumns = True End Sub


Una pequeña mejora de la versión de Schnapple

int nLastColumn = dgv.Columns.Count - 1; for (int i = 0; i < dgv.Columns.Count; i++) { if (nLastColumn == i) { dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } else { dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; } } for (int i = 0; i < dgv.Columns.Count; i++) { int colw = dgv.Columns[i].Width; dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; dgv.Columns[i].Width = colw; }


Versión AC # del código de Miroslav Zadravec

for (int i = 0; i < dataGridView1.Columns.Count-1; i++) { dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; } dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; for (int i = 0; i < dataGridView1.Columns.Count; i++) { int colw = dataGridView1.Columns[i].Width; dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; dataGridView1.Columns[i].Width = colw; }

Publicado como Wiki de la comunidad para no perder la reputación de los demás


dataGridView1.AutoResizeColumns ();


foreach (DataGridViewColumn c in dataGridView.Columns) c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);

Esto debería funcionar ya sea que se muestre o no dataGridView (es decir, incluso si se llama desde el constructor de la clase).

El mismo método, pero con DataGridViewAutoSizeColumnMode.DisplayedCells , falla en el caso anterior por la razón obvia: ¡aún no se ha mostrado ninguna celda! Por alguna razón no obvia, AutoResizeColumns también falla en este caso.


  • Gracias por la solución anterior (Para iterar a través de DataGridView.Columns , cambie AutoSizeMode por uno válido, recopile el valor de ancho y vuelva a configurarlo después de cambiar AutoSizeMode a DataGridViewAutoSizeColumnMode.None ).
  • Luché con él y me di cuenta de que no funcionará siempre que lo llame el constructor de la clase o cualquier línea antes de Form.Show() o Form.ShowDialog() . Así que puse este fragmento de código en el evento Form.Shown y esto funciona para mí.
  • Mi código transformado, independientemente de cualquier DataGridView.AutoSizeColumnsMode establecido antes, utilizo DataGridViewColumn.GetPreferredWidth() lugar de cambiar DataGridViewColumn.AutoSizeMode y establezco el valor de ancho inmediatamente, luego cambio DataGridView.AutoSizeColumnsMode una vez:

    private void form_Shown(object sender, EventArgs e) { foreach (DataGridViewColumn c in dataGridView.Columns) c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.DisplayedCells, true); dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; }

  • Asegúrate de configurar

    dataGridView.AllowUserToResizeColumns = true;

  • No sé cómo es que esto solo funciona después de que se muestre el formulario.