Autoajuste y relleno de DataGridView

82

Tengo 3 columnas en mi DataGridView. Lo que estoy tratando de hacer es que las primeras 2 columnas se ajusten automáticamente al ancho del contenido y que la tercera columna llene el espacio restante.

¿Es posible hacerlo en WinForms? Estoy cargando mis datos desde un EF DataContext si sirve de algo. He incluido una imagen de cómo se ve actualmente.

ingrese la descripción de la imagen aquí

James Jeffery
fuente

Respuestas:

165

Necesitas usar la DataGridViewColumn.AutoSizeModepropiedad.

Puede utilizar uno de estos valores para las columnas 0 y 1:

AllCells: el ancho de la columna se ajusta para adaptarse al contenido de todas las celdas de la columna, incluida la celda del encabezado.
AllCellsExceptHeader: el ancho de la columna se ajusta para ajustarse al contenido de todas las celdas de la columna, excluyendo la celda del encabezado.
DisplayedCells: el ancho de la columna se ajusta para adaptarse al contenido de todas las celdas de la columna que se encuentran en las filas que se muestran actualmente en pantalla, incluida la celda del encabezado.
DisplayedCellsExceptHeader: el ancho de la columna se ajusta para adaptarse al contenido de todas las celdas de la columna que están en las filas que se muestran actualmente en pantalla, excluyendo la celda del encabezado.

Luego usa el valor de relleno para la columna 2

El ancho de la columna se ajusta de modo que el ancho de todas las columnas llene exactamente el área de visualización del control ...

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Como señalaron otros usuarios, el valor predeterminado se puede establecer al datagridviewnivel de la DataGridView.AutoSizeColumnsModepropiedad.

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

podría ser:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

Nota IMPORTANTE:

Si su cuadrícula está vinculada a una fuente de datos y las columnas se generan automáticamente (la AutoGenerateColumnspropiedad se establece en True), debe usar el DataBindingCompleteevento para aplicar el estilo DESPUÉS de que se hayan creado las columnas.


En algunos escenarios (cambiar el valor de las celdas por código, por ejemplo), tuve que llamar DataGridView1.AutoResizeColumns();para actualizar la cuadrícula.

Chris
fuente
1
Funciona perfectamente cuando se usa el evento DataBindingComplete.
James Jeffery
No puedo entender cómo llamar al método DataBindingComplete después de que se completa la cuadrícula de datos
Dan
@Dan DataBindingComplete no es un método , es un evento de vista de cuadrícula de datos al que debe suscribirse. Esta respuesta stackoverflow.com/a/31685874/2387010 da un ejemplo. ¿Ayuda?
Chris
Sería útil si se explicara el ejemplo, pero será suficiente. El artículo de MSDN al que vinculó en su publicación lo muestra como un método, que es lo que usé como mi patrón pero no puedo entender cómo se llama.
Dan
1
@Chris, esa información que falta es definitivamente útil, gracias. Estoy leyendo este libro y acabo de llegar al capítulo sobre delegados y funciones lambda, así que espero que esto tenga más sentido en breve. ¡Gracias!
Dan
22

Este es mi enfoque favorito ...

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };
AlfredBr
fuente
Si el tamaño de la columna = 0, index out of bound exceptionsimplemente corríjalo, ¡gracias!
TiyebM
14

Simplemente cambie Propiedad de propiedad de control: AutoSizeColumnsMode:Fill

O por código

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;

Ahosan Karim Asik
fuente
1
Gracias. ¡Estaba buscando una solución como esta! :)
Alin Ciocan
4

No probado, pero puedes intentarlo. Probado y funcionando. Espero que pueda jugar con AutoSizeModede DataGridViewColumlograr lo que necesita.

Intenta configurar

dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode

//Set the following properties after setting datasource
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Esto debería funcionar

Sriram Sakthivel
fuente
Esto no funciona. Lo estoy configurando cuando el formulario se inicializa antes de que se agregue la fuente de datos desde DataContext. ¿Podría ser por eso? No estoy seguro de dónde configurarlo ya que los datos se cargan en tiempo de ejecución y las columnas se toman del modelo EF.
James Jeffery
Parece así pero no, la tercera línea no funciona, probé esto hace 10 minutos.
King King
@JamesJeffery, ¿está poblando automáticamente columnas o completando manualmente?
Sriram Sakthivel
@SriramSakthivel Estoy usando la propiedad dataGridView1.DataSource para vincular una lista devuelta desde mi DataContext.
James Jeffery
0

Trata de hacerlo,

 AutoSizeColumnMode = Fill;
Aki
fuente
0
public static void Fill(DataGridView dgv2)
   {
        try
        {
            dgv = dgv2;
            foreach (DataGridViewColumn GridCol in dgv.Columns)
            {
                for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++)
                {
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                    GridCol.DataGridView.Columns[j].FillWeight = 1;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
Arrendajo
fuente
1
Este código no es genial. Primero, no necesita el bucle anidado, que establece el modo de ancho de todas las columnas en lo mismo muchas veces (<número de columnas>); puede acceder a las propiedades AutoSizeMode y FillWeight de cada columna directamente desde GridCol. En segundo lugar, establece AutoSizeMode para cada columna en dos valores diferentes; la segunda asignación sobrescribirá la primera.
JonP
0

Para construir sobre la respuesta de AlfredBr, si ocultó algunas de sus columnas, puede usar lo siguiente para ajustar automáticamente el tamaño de todas las columnas y luego hacer que la última columna visible llene el espacio vacío:

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;
RooiWillie
fuente
0

Esto es lo que hice para que la columna "first_name" llene el espacio cuando todas las columnas no pueden hacerlo.

Cuando la cuadrícula se vuelve pequeña, la columna "first_name" se vuelve casi invisible (muy delgada), por lo que puedo establecer DataGridViewAutoSizeColumnMode en AllCells como las otras columnas visibles. Para problemas de rendimiento, es importante establecerlos en None antes de vincularlos y volver a establecerlos en AllCell en el controlador de eventos DataBindingComplete de la cuadrícula. ¡Espero eso ayude!

private void dataGridView1_Resize(object sender, EventArgs e)
    {
        int ColumnsWidth = 0;
        foreach(DataGridViewColumn col in dataGridView1.Columns)
        {
            if (col.Visible) ColumnsWidth += col.Width;
        }

        if (ColumnsWidth <dataGridView1.Width)
        {
            dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
        else if (dataGridView1.Columns["first_name"].Width < 10) dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }
Ignacio
fuente
-1
public void setHeight(DataGridView src)
{
    src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 +   src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}
Durga Prasad Guntoju
fuente
simplemente llame a esa función, se encargará de decidir la altura de la vista de cuadrícula de datos en función del número de filas en ella
Durga Prasad Guntoju
1
En primer lugar, eso no responde a la pregunta del PO. Además (para referencia futura) incluya dicho comentario en la respuesta en sí (puede editarlo).
Joel
-2

Prueba esto :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
Sudhir
fuente