¿Cómo se dibuja un borde alrededor de una celda DataGridView mientras se está editando?

Me gustaría dibujar un borde rojo alrededor de unDataGridView celda mientras se está editando.

Logré dibujar un borde rojo alrededor de la celda seleccionada mientras no se está editando con este código:

private void Form1_Load(object sender, EventArgs e)
{
    this.Width = 650;
    this.Height = 250;
    dataGridView1.Left = 5;
    dataGridView1.Top = 5;
    dataGridView1.Width = 600;
    dataGridView1.Height = 175;

    DataTable dt = new DataTable("Test Table");
    dt.Columns.Add("Column 1");
    dt.Columns.Add("Column 2");
    dt.Columns.Add("Column 3");
    dt.Columns.Add("Column 4");
    dt.Columns.Add("Column 5");
    dt.Rows.Add(dt.NewRow());
    dt.Rows.Add(dt.NewRow());
    dt.Rows.Add(dt.NewRow());
    dt.Rows.Add(dt.NewRow());
    dt.Rows.Add(dt.NewRow());
    dataGridView1.DataSource = dt;

    dataGridView1.AllowUserToAddRows = false;
    dataGridView1.AllowUserToDeleteRows = false;
    dataGridView1.MultiSelect = false;
    dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
    dataGridView1.DefaultCellStyle.SelectionBackColor = Color.White;
    dataGridView1.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.dataGridView1_CellPainting);
    dataGridView1.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(this.dataGridView1_EditingControlShowing);
}

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex != -1 && e.RowIndex != -1 && dataGridView1[e.ColumnIndex, e.RowIndex].Selected)
    {
        using (Brush borderBrush = new SolidBrush(Color.Red))
        {
            using (Pen borderPen = new Pen(borderBrush, 2))
            {
                Rectangle rectDimensions = e.CellBounds;
                rectDimensions.Width -= 2;
                rectDimensions.Height -= 2;
                rectDimensions.X = rectDimensions.Left + 1;
                rectDimensions.Y = rectDimensions.Top + 1;

                e.Graphics.DrawRectangle(borderPen, rectDimensions);

                e.Handled = true;
            }
        }
    }
}

Lo que produce este resultado:

Sin embargo, cuando edita una celda, esto sucede:

Parece elEditingControl se dibuja sobre la parte superior de mi borde rojo. Desafortunadamente, no puedo encontrar una manera de solucionar esto, por lo que mi borde rojo permanecerá completamente visible en todo momento.

¿¿¿Cómo puedo hacer esto???


Esto es lo que he probado hasta ahora:

1) Manejando elEditingControlShowing() evento para volver a dibujar manualmente el borde de esta manera:

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    Graphics gfx = e.Control.CreateGraphics();

    using (Brush borderBrush = new SolidBrush(Color.Red))
    {
        using (Pen borderPen = new Pen(borderBrush, 2))
        {
            Rectangle rectDimensions = e.Control.ClientRectangle;
            rectDimensions.Width -= 2;
            rectDimensions.Height -= 2;
            rectDimensions.X = rectDimensions.Left + 1;
            rectDimensions.Y = rectDimensions.Top + 1;

            gfx.DrawRectangle(borderPen, rectDimensions);
        }
    }
}

Pero esto no dibujó nada. Intenté algunas variaciones de esto, pero todas ellas todavía no dibujaron nada aquí.


2) Entonces traté de manejar elPaint() evento de laEditingControl Me gusta esto:

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    e.Control.Paint -= new PaintEventHandler(dataGridView1_EditingControl_Paint);
    e.Control.Paint += new PaintEventHandler(dataGridView1_EditingControl_Paint);
}

void dataGridView1_EditingControl_Paint(object sender, PaintEventArgs e)
{
    MessageBox.Show("Starting EditingControl Paint() Event...");
}

Pero este evento ni siquiera se dispara. Más tarde leí en alguna parte que elEditingControl usa un normalTextBox, que no dispara elPaint() evento porque es manejado por Windows en su lugar.


3) Finalmente, en lugar de intentar volver a pintar otro borde, decidí tratar de piratearlo cambiando el tamaño delEditingControl ser más pequeño que mi borde con la esperanza de que el borde se muestre a su alrededor, así:

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    e.Control.Resize -= new EventHandler(dataGridView1_EditingControl_Resize);
    e.Control.Resize += new EventHandler(dataGridView1_EditingControl_Resize);
}

void dataGridView1_EditingControl_Resize(object sender, EventArgs e)
{
    dataGridView1.EditingControl.Left = 20;
}

Sin embargo, eso me dio este resultado:

Entonces elTextBox se movió hacia la izquierda, pero parece que hay otro control debajo que todavía está bloqueando mi borde rojo. Sin embargo, no puedo encontrar de todos modos para tener acceso a ese control para cambiar el tamaño, por lo que esto tampoco funcionó para mí.


4) También intenté usar el código del n. ° 1 anterior para volver a dibujar el borde en elResize() evento, pero eso todavía no hizo nada. Aunque, usandodataGridView1.EditingControl.BackColor = Color.Red; funcionó para poder formatear algunas partes del control aquí, pero parece que tratar de dibujar un borde no es una de ellas.

Todo lo que quiero hacer es mantener un borde rojo alrededor de la celda mientras se está editando. ¿Sabes cómo puedo hacer esto?

Respuestas a la pregunta(3)

Su respuesta a la pregunta