我希望在编辑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. 然后我尝试处理EditingControl
的Paint()
事件,代码如下:
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;
可以工作,因此我可以格式化控件的某些部分,但似乎尝试绘制边框不是其中之一。
我想做的就是在编辑时保持单元格周围显示红色边框。 您知道我该如何做吗?