Как нарисовать границу вокруг ячейки 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;
сработал, поэтому я могу отформатировать некоторые части элемента управления здесь, но кажется, что попытка нарисовать границу не является одним из них.
Все, что я хочу сделать, это держать красную рамку вокруг ячейки, пока она редактируется. Ты знаешь, как я могу это сделать?