我需要根据特定条件更改DataGridView
单元的背景色,因为用户正在编辑单元格。现在,我只能在单元格失去焦点后才能更改BackColor
。
具体来说,当用户在单元格中键入内容时,我需要检查DataTable
是否绑定了DataGridView
,以便将用户键入的内容与数据表中DataTable中的值进行比较。相应的单元格。如果不同,则需要将BackColor
更改为Yellow。而且,如果用户将单元格中的值更改回DataTable中的原始值,则需要删除颜色。
我尝试弄乱KeyPress
事件,但无法弄清楚如何获取正在编辑的单元格的特定行/列索引,因此我可以根据相应的{{1 }}的行/列索引值。
答案 0 :(得分:0)
这并不容易,您需要处理一些事情:
TextChanged
事件,然后在TextChanged
事件处理程序中,将文本与数据源值进行比较,并根据该文本着色文本框。以下是屏幕截图:
这是一个可行的示例:
public DataTable GetProducts()
{
var products = new DataTable();
products.Columns.Add("Id", typeof(int));
products.Columns.Add("Name", typeof(string));
products.Columns.Add("Price", typeof(int));
products.Rows.Add(1, "Product 1", 100);
products.Rows.Add(2, "Product 2", 200);
products.AcceptChanges();
return products;
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = GetProducts();
dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing;
dataGridView1.CellPainting += dataGridView1_CellPainting;
dataGridView1.CellBeginEdit += dataGridView1_CellBeginEdit;
dataGridView1.CellEndEdit += dataGridView1_CellEndEdit;
}
private void dataGridView1_CellEndEdit(object sender,
DataGridViewCellEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0 || e.RowIndex == dataGridView1.NewRowIndex)
return;
var drv = dataGridView1.Rows[e.RowIndex].DataBoundItem as DataRowView;
if (drv != null)
{
drv.EndEdit();
}
}
private void dataGridView1_CellBeginEdit(object sender,
DataGridViewCellCancelEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0 || e.RowIndex == dataGridView1.NewRowIndex)
return;
BeginInvoke(new Action(() =>
{
var textBox = dataGridView1.EditingControl as DataGridViewTextBoxEditingControl;
if (textBox != null)
{
SetEditingControlColor(textBox);
}
}));
}
private void dataGridView1_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0 || e.RowIndex == dataGridView1.NewRowIndex)
return;
var drv = dataGridView1.Rows[e.RowIndex].DataBoundItem as DataRowView;
if (drv != null && drv.Row.HasVersion(DataRowVersion.Original))
{
var column = dataGridView1.Columns[e.ColumnIndex].DataPropertyName;
if (drv.Row[column, DataRowVersion.Current]
.Equals(drv.Row[column, DataRowVersion.Original]))
{
e.CellStyle.BackColor = Color.White;
}
else
{
e.CellStyle.BackColor = Color.Yellow;
}
return;
}
e.CellStyle.BackColor = Color.LimeGreen;
}
void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{
var textBox = e.Control as DataGridViewTextBoxEditingControl;
if (textBox != null)
{
textBox.TextChanged -= textbox_TextChanged;
textBox.TextChanged += textbox_TextChanged;
}
}
private void textbox_TextChanged(object sender, EventArgs e)
{
var textBox = (DataGridViewTextBoxEditingControl)sender;
SetEditingControlColor(textBox);
}
void SetEditingControlColor(DataGridViewTextBoxEditingControl textBox)
{
var dgv = textBox.EditingControlDataGridView;
var drv = dgv.CurrentCell.OwningRow.DataBoundItem as DataRowView;
if (drv != null && drv.Row.HasVersion(DataRowVersion.Original))
{
var column = dgv.Columns[dgv.CurrentCell.ColumnIndex].DataPropertyName;
var value = drv.Row[column, DataRowVersion.Original];
if (textBox.Text.Equals($"{value}"))
{
textBox.BackColor = Color.White;
textBox.Parent.BackColor = Color.White;
}
else
{
textBox.BackColor = Color.Yellow;
textBox.Parent.BackColor = Color.Yellow;
}
return;
}
textBox.BackColor = Color.LimeGreen;
textBox.Parent.BackColor = Color.LimeGreen;
}