Как нарисовать границу вокруг ячейки DataGridView во время ее редактирования?

Я хотел бы нарисовать красную границу вокругDataGridView клетка, пока она редактируется.

Мне удалось нарисовать красную рамку вокруг выделенной ячейки, пока она не редактируется с помощью этого кода:

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;
            }
        }
    }
}

Который дает этот результат:

Однако, когда вы редактируете ячейку, это происходит:

КажетсяEditingControl рисует себя поверх большей части моей красной границы. К сожалению, я не могу найти способ исправить это, поэтому моя красная рамка будет постоянно отображаться полностью.

Как я могу это сделать???


Вот что я пробовал до сих пор:

1. ОбработкаEditingControlShowing() Событие для ручной перерисовки границы следующим образом:

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);
        }
    }
}

Но это ничего не привлекло. Я попробовал несколько вариантов этого, но все они все еще ничего не рисовали здесь.


2. Затем я попытался справиться сPaint() событиеEditingControl как это:

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...");
}

Но это событие даже не срабатывает. Я позже где-то читал, чтоEditingControl использует нормальныйTextBox, который не увольняетPaint() событие, потому что это обрабатывается Windows вместо.


3. Наконец, вместо того, чтобы перерисовывать другую границу, я решил попытаться ее обойти, изменив размерEditingControl быть меньше, чем моя граница, в надежде, что граница будет отображаться вокруг нее, вот так:

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;
}

Однако, это только что дало мне такой результат:

ИтакTextBox перешел влево, но, похоже, под ним есть еще один элемент управления, который все еще блокирует мою красную границу. Однако я не могу найти доступ к этому элементу управления, чтобы изменить его размер, так что это не сработало и для меня.


4. Я также попытался использовать код из # 1 выше, чтобы заново нарисовать границу вResize() событие, но это все еще ничего не сделало. Хотя, используяdataGridView1.EditingControl.BackColor = Color.Red; сработал, поэтому я могу отформатировать некоторые части элемента управления здесь, но кажется, что попытка нарисовать границу не является одним из них.

Все, что я хочу сделать, это держать красную рамку вокруг ячейки, пока она редактируется. Ты знаешь, как я могу это сделать?

Ответы на вопрос(3)

Ваш ответ на вопрос