DataGridView DefaultCellStyle阻止背景色更改
本文关键字:背景色 DefaultCellStyle DataGridView | 更新日期: 2023-09-27 18:26:20
我所做的是比较两个数据表以检查更改。如果表单元格值发生更改,我会通过更改其BackColor属性来标记相应的DataGridView单元格。在我需要设置DataGridView.DefaultCellStyle.RappMode=DataGridViewTriState.True和DataGridView.AutoSizeRowsMode=DataGridView AutoSizeRowsMode.AllCells之前,这一直很有效。我需要这样做,这样我就可以让文本转到单元格内的新行。这里有一个StackOverflow的答案来解释这一点。因此,在设置了DefaultCellStyle之后,我无法更改BackColor。然而,我有一个Validator类,它获取传入的DataGridViewCell并验证该值。如果单元格中的文本无效或格式不正确,Style.BackColor将被更改。。。这很管用!我的问题是,为什么我的Validator类可以更改BackColor,但我不能直接从表单中更改?以下是我正在做的事情和正在经历的事情的简化示例:
private void initDataGridView()
{
DataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
DataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
DataGridView.MultiSelect = false;
DataGridView.AllowUserToAddRows = false;
DataGridView.AllowUserToDeleteRows = false;
DataGridView.RowHeadersVisible = false;
// ADD EVENT HANDLERS
DataGridView.CellEndEdit += DataGridView_CellEndEdit;
}
private void compareTables()
{
string dataTableCell;
string dataTableMirrorCell;
for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
{
for (int colIndex = 2; colIndex < dataTable.Columns.Count; colIndex++)
{
// initialize cell values to compare
dataTableCell = dataTable.Rows[rowIndex].Field<string>(colIndex);
dataTableMirrorCell = dataTableMirror.Rows[rowIndex].Field<string>(colIndex);
// now compare cell values
if (dataTableCell != dataTableMirrorCell)
{
if (dataTableCell== null
|| dataTableCell== string.Empty)
{
dataGridView.Rows[rowIndex].Cells[colIndex].Style.BackColor = Color.Red;
dataGridView.Rows[rowIndex].Cells[colIndex].Tag = "Delete";
}
else
{
if (dataTableMirrorCell == null
|| dataTableMirrorCell == string.Empty)
{
dataGridView.Rows[rowIndex].Cells[colIndex].Style.BackColor = Color.Orange;
dataGridView.Rows[rowIndex].Cells[colIndex].Tag = "Add";
}
else
{
dataGridView.Rows[rowIndex].Cells[colIndex].Style.BackColor = Color.Yellow;
dataGridView.Rows[rowIndex].Cells[colIndex].Tag = "Change";
}
}
}
}
}
}
private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
Validator validator = new Validator(this);
if (e.ColumnIndex != dgv.Columns["Name"].Index)
{
DataGridViewCell cell = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex];
// Check the value for valid format
validator.validateCell(cell, ValidationType.Numeric);
}
}
这是Validator.validateCell方法:
public void validateCell(DataGridViewCell cell, String type)
{
// NUMERIC
if (type.ToLower() == "numeric")
{
int result;
if (!int.TryParse(cell.Value.ToString(), out result))
{
cell.Style.BackColor = Color.Beige;
cell.Style.Font = new Font(this.form.Font, FontStyle.Bold);
cell.ToolTipText = "This is a " + type + " only field.";
cell.Tag = "invalid";
}
else
{
cell.Style.BackColor = Color.White;
cell.Style.Font = new Font(this.form.Font, FontStyle.Regular);
cell.ToolTipText = string.Empty;
cell.Tag = "valid";
}
}
}
Validator.validateCell WORKS,它会更改单元格的BackColor和Font。有人能解释一下为什么本地方法compareTables不会更改BackColor,而我的验证器.validateCell会更改吗?非常感谢你帮助我学习!
我一直使用:
dataGridView.RowsDefaultCellStyle.SelectionBackColor = Color.Red;
设置或获取dataGridView背景色。不确定这是否有助于你从另一个方向看