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;
}
Tal vez podrías llamar
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);
Después de establecer el origen de datos. Fijará el ancho y permitirá el cambio de tamaño.
Más sobre MSDN DataGridView.AutoResizeColumns Method (DataGridViewAutoSizeColumnsMode) .
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
, cambieAutoSizeMode
por uno válido, recopile el valor de ancho y vuelva a configurarlo después de cambiarAutoSizeMode
aDataGridViewAutoSizeColumnMode.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()
oForm.ShowDialog()
. Así que puse este fragmento de código en el eventoForm.Shown
y esto funciona para mí. Mi código transformado, independientemente de cualquier
DataGridView.AutoSizeColumnsMode
establecido antes, utilizoDataGridViewColumn.GetPreferredWidth()
lugar de cambiarDataGridViewColumn.AutoSizeMode
y establezco el valor de ancho inmediatamente, luego cambioDataGridView.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.