Vorrei disegnare un bordo rosso attorno a una cella DataGridView
durante la modifica.Come si disegna un bordo attorno a una cella DataGridView mentre viene modificato?
sono riuscito a disegnare un bordo rosso intorno alla cella selezionata, mentre non è in corso di modifica utilizzando questo codice:
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;
}
}
}
}
che produce questo risultato:
Tuttavia, quando si modifica una cella succede:
Sembra che lo EditingControl
si disori sopra la maggior parte del mio bordo rosso. Sfortunatamente, non riesco a trovare un modo per sistemarlo, quindi il mio bordo rosso rimarrà sempre visualizzato in ogni momento.
Come posso fare questo ???
Ecco quello che ho provato finora:
1. gestione dell'evento EditingControlShowing()
manualmente ri-disegnare il confine in questo modo:
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);
}
}
}
Ma questo non ha disegnato nulla. Ho provato alcune varianti di questo, ma tutte non hanno ancora disegnato nulla qui.
2. Ho poi cercato di gestire l'evento Paint()
del EditingControl
in questo modo:
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...");
}
Ma questo evento non ha nemmeno il fuoco. Successivamente ho letto da qualche parte che lo EditingControl
utilizza un normale TextBox
, che non genera l'evento Paint()
perché è gestito da Windows.
3. Infine, piuttosto che cercare di ri-disegnare un altro confine, ho deciso di provare e incidere intorno esso ridimensionando la EditingControl
essere più piccolo del mio confine nella speranza confine sarebbe poi mostrare in giro che, in questo modo:
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;
}
Tuttavia, che mi ha dato questo risultato:
Quindi lo TextBox
si è spostato a sinistra, ma sembra che ci sia un altro controllo al di sotto che sta ancora bloccando il mio bordo rosso.Tuttavia, non riesco a trovare comunque l'accesso a questo controllo per ridimensionarlo, quindi questo non ha funzionato neanche per me.
4. Ho anche provato ad utilizzare il codice da sopra 1 # per ri-disegnare il bordo in caso Resize()
, ma che ancora non ha fatto nulla. Anche se, usando dataGridView1.EditingControl.BackColor = Color.Red;
ha funzionato così posso qui formattare alcune parti del controllo, ma sembra che provare a disegnare un bordo non è uno di loro.
Tutto ciò che voglio fare è mantenere un bordo rosso visibile intorno alla cella mentre è in corso di modifica. Sai come posso fare questo?
Hai provato ad affrontare gli orrori di borderstyles? – TaW
Ho dato un'occhiata a loro ma tutto quello che ho trovato era opzioni per impostare il BorderStyle su none, inset, raised, ecc. Ma non ero sicuro se ci fosse un modo per impostare anche i colori del bordo che li usano? – Calcolat
Hai ragione, i colori non fanno parte di BorderStyles. – TaW