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 DefaultCellStyle阻止背景色更改

我一直使用:

dataGridView.RowsDefaultCellStyle.SelectionBackColor = Color.Red;

设置或获取dataGridView背景色。不确定这是否有助于你从另一个方向看