una tabla repetir quitar porque por mostrar los las insertar filas fila etiquetas etiqueta elementos duplican dinamica definicion datos como columnas columna campos cambiar blanco c# winforms datagridview

tabla - ¿Cómo se resaltan las etiquetas de fila y/o columna de una vista de cuadrícula de datos al pasar el mouse sobre cualquier celda(en c#)?



quitar(en blanco) tabla dinamica (3)

Con un control DataGridView en un formulario de Windows, cuando mueve el mouse sobre una etiqueta de fila (o etiqueta de columna) su fondo (la celda de etiqueta) cambia a un tono azul (u otro color dependiendo de su esquema de color de Windows sin duda).

Me gustaría producir ese efecto al mover el mouse sobre cualquier celda de la cuadrícula, es decir, resaltar la etiqueta de fila para la fila sobre la que se encuentra el mouse actualmente.

La lógica para cambiar el estilo de la fila actual es bastante simple usando el evento mouseover. Puedo cambiar otros atributos de la fila (como decir el color de fondo) pero realmente me gustaría algo más sutil que eso y creo que resaltar la etiqueta de la fila sería muy efectivo.

¿Se puede hacer? Si es así, ¿cómo? (C # preferiblemente)


Puede conectar los eventos CellMouseEnter y CellMouseLeave de DataGridView y luego cambiar el color de fondo en consecuencia. Algo como esto:

private void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex < 0) //column header / row headers { return; } this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.LightBlue; } private void dataGridView1_CellMouseLeave(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex < 0) //column header / row headers { return; } this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.White; }


Puede anular el evento OnCellPainting para hacer lo que desee. Dependiendo del tamaño de su DataGridView , puede ver parpadeo, pero esto debería hacer lo que quiera.

class MyDataGridView : DataGridView { private int mMousedOverColumnIndex = int.MinValue; private int mMousedOverRowIndex = int.MinValue; protected override void OnCellMouseEnter(DataGridViewCellEventArgs e) { mMousedOverColumnIndex = e.ColumnIndex; mMousedOverRowIndex = e.RowIndex; base.OnCellMouseEnter(e); base.Refresh(); } protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e) { if (((e.ColumnIndex == mMousedOverColumnIndex) && (e.RowIndex == -1)) || ((e.ColumnIndex == -1) && (e.RowIndex == mMousedOverRowIndex))) { PaintColumnHeader(e, System.Drawing.Color.Red); } base.OnCellPainting(e); } private void PaintColumnHeader(System.Windows.Forms.DataGridViewCellPaintingEventArgs e, System.Drawing.Color color) { LinearGradientBrush backBrush = new LinearGradientBrush(new System.Drawing.Point(0, 0), new System.Drawing.Point(100, 100), color, color); e.Graphics.FillRectangle(backBrush, e.CellBounds); DataGridViewPaintParts parts = (DataGridViewPaintParts.All & ~DataGridViewPaintParts.Background); e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None; e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None; e.Paint(e.ClipBounds, parts); e.Handled = true; } }


Sé que ya tienes la respuesta para esto, pero compartiré algo diferente.

De esta manera, toda la fila está pintada . Acabo de modificar los comentarios de @BFree un poco.

private void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex < 0) //column header / row headers { return; } foreach (DataGridViewCell cell in this.dataGridView1.Rows[e.RowIndex].Cells) { cell.Style.BackColor = Color.LightBlue; } } private void dataGridView1_CellMouseLeave(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex < 0) //column header / row headers { return; } foreach (DataGridViewCell cell in this.dataGridView1.Rows[e.RowIndex].Cells) { cell.Style.BackColor = Color.White; } }