Estoy completando un control DataGridView en un formulario de Windows (C # 2.0 no WPF).
Mi objetivo es mostrar una cuadrícula que llene cuidadosamente todo el ancho disponible con celdas, es decir, que no haya áreas no utilizadas (gris oscuro) en la parte derecha y el tamaño de cada columna de acuerdo con los datos que contiene, pero también permite al usuario cambiar el tamaño de cualquiera de las columnas. a su gusto.
Estoy intentando lograr esto configurando 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é perfectamente llena de datos. (No me importa que cuando el usuario intenta cambiar el tamaño de esta columna, vuelve a un tamaño que garantiza que siempre se use el espacio horizontal).
Sin embargo, como mencioné, una vez cargada, me gustaría permitir que el usuario cambie el tamaño de las columnas para que se adapten a sus propios requisitos; al establecer estos valores de AutoSizeMode para cada columna, parece que el usuario no puede cambiar el tamaño de esas columnas.
Intenté no configurar AutoSizeMode de todas las columnas, lo que permite cambiar el tamaño, PERO no establece el tamaño inicial de acuerdo con los datos que contienen las celdas. El mismo resultado ocurre cuando se cambia el AutoSizeMode de la cuadrícula a "No establecido" después de cargar los datos.
¿Hay una configuración que me falta aquí que permita la configuración automática de los anchos de columna predeterminados Y el cambio de tamaño del usuario o hay otra técnica que debo usar al completar el control DataGridView?
fuente
Respuestas:
Este truco funciona para mí:
Lo que sucede aquí es que establece el tamaño automático en el modo que necesite y luego, columna por columna, almacena el ancho que obtuvo del cálculo del tamaño automático, elimina el tamaño automático y establece el ancho en el valor que almacenó antes.
fuente
grd.Columns(i).Width = grd.Columns(i).Width
ya funcionará. Vea aquí .dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
Tal vez podrías llamar
Después de configurar la fuente de datos. Establecerá el ancho y permitirá cambiar el tamaño.
Más sobre el método DataGridView.AutoResizeColumns de MSDN (DataGridViewAutoSizeColumnsMode) .
fuente
DataGridViewAutoSizeColumnsMode.DisplayedCells
. Además, en el Diseñador de formularios, AutoSizeColumnsMode se establece en Ninguno. Necesitaba ejecutar esta llamada al método en el controlador de eventos DataBindingComplete de DataGridView, para asegurarme de que siempre (re) dimensione correctamente.Versión AC # del código de Miroslav Zadravec
Publicado como Wiki de la comunidad para no burlarse de la reputación de los demás
fuente
En mi aplicación he configurado
Además, he configurado el
Ahora el ancho de las columnas se puede cambiar y el usuario puede reorganizarlas. Eso funciona bastante bien para mí.
Quizás eso funcione para ti.
fuente
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
Aquí está el resultado
fuente
Bueno, hice esto así:
en ese orden en particular. Las columnas cambian de tamaño (extendidas) Y el usuario puede cambiar el tamaño de las columnas posteriormente.
fuente
Si entendí la pregunta correctamente, debería haber una manera más fácil de lograr lo que necesita. Llamada
dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
Eso debería hacer el truco. Sin embargo, existe un problema, ya que no puede simplemente llamar a este método directamente después de completar su control DataGridView. En su lugar, tendrá que agregar un EventHandler para el evento VisibleChanged y llamar al método allí.
fuente
Un simple dos líneas de código me funciona.
fuente
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 permita que el usuario establezca el ancho de la columna ...
¡Desarrollando a partir de la respuesta de Miroslav Zadravec , para mí lo que funcionó fue usar inmediatamente el auto calculado
column.Width
para configurar ...column.Width
!Esto se prueba para que funcione cuando
DataGridView
ya está creado, usando un truco como este .fuente
Esto hizo maravillas para mí:
fuente
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Esto ajusta automáticamente todas las columnas de acuerdo con su contenido, llena el espacio vacío restante estirando una columna específica y evita el comportamiento de "salto" configurando la última columna para que se llene para cualquier cambio de tamaño futuro.
fuente
Código C # ligeramente más ordenado del código de Miroslav Zadravec asumiendo que todas las columnas deben tener un tamaño automático
fuente
Otra versión del código de Miroslav Zadravec, pero un poco más automatizada y universal:
Puse la segunda parte en un evento separado, porque completé la
datagridvew
inicialización del formulario y si ambas partes están allí, no cambiará nada, porque probablemente el tamaño automático calcula los anchos después de quedatagridview
se muestra, por lo que los anchos siguen siendo los predeterminados en elForm1()
método. Después de terminar este método, el tamaño automático hace su truco e inmediatamente después de eso (cuando se muestra el formulario) podemos establecer los anchos por la segunda parte del código (aquí en elForm1Shown
evento). Esto me está funcionando a las mil maravillas.fuente
Aquí hay un código simplificado para la respuesta de Miroslav Zadravec en c #:
fuente
¿Intentó configurar la
FillWeight
propiedad de suDataGridViewColumns
objeto?Por ejemplo:
Creo que debería funcionar en tu caso.
fuente
Una pequeña mejora de la versión de Schnapple
fuente
dataGridView1.AutoResizeColumns ();
fuente
Los anchos de columna configurados para adaptarse a su contenido He usado la siguiente declaración, resolvió mi problema.
Primer paso :
Segundo paso :
Tercer paso :
fuente
Esto debería funcionar si
dataGridView
se ha mostrado o no (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.fuente
Si vincula su fuente de datos a una tabla de datos, por ejemplo, debe establecer las propiedades después de que finalice el enlace:
fuente
DataGridView.Columns
, cambieAutoSizeMode
a uno válido, recopile el valor de ancho y vuelva a configurarlo después del cambioAutoSizeMode
aDataGridViewAutoSizeColumnMode.None
).Form.Show()
oForm.ShowDialog()
. Así que puse este fragmento de código en elForm.Shown
evento y esto me funciona.Mi código transformado, independientemente de lo que haya
DataGridView.AutoSizeColumnsMode
configurado antes, lo uso enDataGridViewColumn.GetPreferredWidth()
lugar de cambiarDataGridViewColumn.AutoSizeMode
y establecer el valor de ancho de inmediato, luego lo cambioDataGridView.AutoSizeColumnsMode
una vez:Asegúrate de configurar
No sé cómo es que esto solo funciona después de que se muestra el formulario.
fuente
Tuve que hacer esto en VB y prefiero dividirlo en un método que coloqué en un Módulo. Puede agregar la columna Relleno como otro parámetro ByRef si lo desea.
fuente
Podrías hacer algo como esto:
Todas las columnas se adaptarán al contenido excepto la última que llenará la cuadrícula.
fuente
Con $ array siendo el contenido de un PSCustomObject, esto funciona:
fuente