una - eliminar datos de un datagridview c#
Cómo eliminar el glifo de clasificación en datagridview sin eliminar la función de clasificación (3)
¿Cómo puedo eliminar el glifo de clasificación de los encabezados de columna en DataGridView sin eliminar su funcionalidad de clasificación?
Estoy trabajando en la aplicación de formulario de Windows en C #, quiero generar un informe desde una vista de cuadrícula de datos, donde el ancho de la columna datagridview se asignará en la columna de informe, donde como la columna DataGridView incluye el orden de glifo de ordenación, eso es espacio innecesario en mi caso, desea excluirlo de ColumnHeader.
Esto es bastante fácil de hacer usando una pintura de celda personalizada.
Todo lo que necesita hacer es manejar el evento DataGridView
CellPainting
:
dataGridView1.CellPainting += new DataGridViewCellPaintingEventHandler(dataGridView1_CellPainting);
Y en el controlador haga algo como esto:
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex == -1)
{
e.Paint(e.CellBounds, DataGridViewPaintParts.All &~DataGridViewPaintParts.ContentBackground);
e.Handled = true;
}
}
El código anterior es muy simple: simplemente verifique si la celda actual está en una fila de encabezado (tiene un índice -1) y luego pinte todo, excepto ContentBackground
.
Solo lo he comprobado en mi máquina con Windows 7 y parece estar bien, parece que el fondo del contenido solo se usa para el glifo de ordenación: querrá probarlo en el entorno de destino para asegurarse de que no necesita hacerlo cualquier pintura personalizada más involucrada para mantener ContentBackground sin el glifo.
El ancho de la celda del encabezado aún incluirá el espacio para el glifo. En general, aceptaría que, dado que cambiar esto se vuelve un poco complicado, pero si debe ajustarse al ancho del texto, entonces algo como lo siguiente funcionará.
Primero configure el ancho en el evento DataBindingComplete
de DataGridView
:
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
if (dataGridView1.AutoSizeColumnsMode == DataGridViewAutoSizeColumnsMode.AllCells)
{
// Loop over all the columns
foreach (DataGridViewColumn c in dataGridView1.Columns)
{
// Work out the size of the header text
Size s = TextRenderer.MeasureText(c.HeaderText, dataGridView1.Font);
// Change the autosize mode to allow us to see if the header cell has the
// longest text
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
if (s.Width + 10 > c.Width)
{
// If the header cell is longest we set the column width
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
c.Width = s.Width + 10;
}
else
{
// If the header cell is not longest, reset the autosize mode
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
}
}
}
Una vez que haya hecho eso, deberá permitir que la columna autoestructure cuando el texto de la celda sea más largo que el encabezado.
Para eso usé el evento CellValueChanged
:
void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
DataGridViewColumn c = dataGridView1.Columns[e.ColumnIndex];
if (c.AutoSizeMode == DataGridViewAutoSizeColumnMode.None)
{
Size s = TextRenderer.MeasureText(dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString(), dataGridView1.Font);
if (s.Width > c.Width)
{
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
}
}
}
No puede hacerlo en WinForms, a menos que escriba una vista de cuadrícula de datos personalizada para satisfacer su necesidad, lo que diría una exageración por su requerimiento.
ACTUALIZAR
Creé barras de progreso personalizadas para los botones, para los controles de lienzo, pero no hice una vista de cuadrícula de datos personalizada. Dicho eso, esta es mi idea de hacer esto ...
Básicamente, crea un nuevo UserControl
y agrega un DataGridView normal a él y elimina los encabezados. Ahora agregue el panel sobre DataGridControl que ''actúa'' en los encabezados de las columnas. Tendrá que manejar todos los eventos, como hacer clic en los encabezados para ordenarlos, redimensionarlos para cambiar el tamaño de las columnas y llamar a los métodos en DataGridView para hacer lo mismo.
Si desea ocultar los encabezados de las columnas cuando el usuario se desplaza hacia abajo, deberá hacerlo manualmente también.
Lo siento, no puedo darte un punto de partida sólido que esto. Si no está familiarizado con la creación de controles personalizados, intente crear un botón personalizado (por ejemplo, que tenga una imagen a la izquierda) o una barra de progreso, que también muestre el porcentaje de progreso en el medio. Tendrá una idea de lo que puede hacer.
Si está usando WPF, creo que cosas como esta pueden lograrse fácilmente.
Me tocó el mismo problema cuando trato de alinear el texto del encabezado para alinearme con el contenido de la celda (me parece tonto ver que el texto del encabezado no está completamente alineado a la derecha). Noté en otros dgv que era posible exprimir el glifo.
De todos modos, una solución realmente simple, complete el texto del encabezado con espacios iniciales y establezca el modo de ajuste de celda del encabezado en falso. ejemplo:
dgv.Columns["Width"].HeaderText = " Width";
dgv["Width"].HeaderCell.Style.WrapMode = DataGridViewTriState.False;
podría tomar un poco de tiempo para corregir el número de espacios iniciales, pero el resultado es agradable. (No sé si funciona con espacios al final, demasiado tarde en la noche para intentarlo).