我有一个 DataGridView,我想通过为这些值提供不同的 ForeColor 来向运算符(operator)显示哪些值发生了变化。运算符(operator)可以通过单击“放弃”按钮来决定放弃所有更改。在这种情况下,我需要让单元格使用继承的样式。

我的问题是,一旦我创建了一个 CellStyle 来指示它已更改,我就无法撤消此操作,因此单元格使用继承的样式。

我做了一些研究。在文章 Cell Styles in the Windows Forms DataGridView Control MSDN 警告:



唉,这似乎不起作用:

DataGridViewCell cell = ...;

Debug.Assert(!cell.HasStyle);           // cell is not using its own style
var cachedColor = cell.Style.ForeColor; // cache the original color
cell.Style.ForeColor = Color.Red;       // indicate a change
Debug.Assert(cell.HasStyle);            // now cell is using its own style

// restore to the 'not set' state:
cell.Style.ForeColor = cachedColor;
Debug.Assert(!cell.HasStyle);           // exception, not using inherited style
cell.Style = cell.InheritedStyle;       // try other method to restore
Debug.Assert(!cell.HasStyle);           // still exception

所以问题: 如何将样式设置恢复到原来的“未设置”状态?

最佳答案

看来我完全误解了 Cell.Style 和 Cell.InheritedStyle。

我认为继承的样式是从行/交替行/DataGridView继承的样式,并且样式是生成的样式。

不是!

生成的样式是 DataGridViewCell.InheritedStyle。这个样式等于 DataGridViewCell.Style,或者如果它有一个空值,它等于 DataGridViewRow.InheritedStyle 的样式,它又等于 DataGridViewRow.DefaultStyle 的值,或者如果它是空的,则 DataGridView.AlternatingRowsDefaultCellStyle 等。

所以要知道实际使用的是哪种样式,请获取 DataGridViewCell.InheritedStyle,以指定特定样式更改 DataGridViewCell.Style 的属性,它会在您获取时自动创建并填充继承值。

要丢弃 DataGridViewCell.Style,只需将其设置为 null。之后 DataGridViewCell.HasStyle 将是 false 并且 DataGridViewCell.InheritedStyle 将是从交替行/所有行继承的样式。

例子:
- “更改”按钮会将当前单元格的前景色更改为红色,将整行的背景色更改为 AliceBlue
- 一个按钮“放弃”将恢复到默认的单元格样式

private void buttonChange_Click(object sender, EventArgs e)
{
    DataGridViewCell cell = this.dataGridView1.CurrentCell;
    DataGridViewRow row = cell.OwningRow;

    if (!row.HasDefaultCellStyle)
    {
        row.DefaultCellStyle.BackColor = Color.AliceBlue;
    }

    if (!cell.HasStyle)
    {
        cell.Style.ForeColor = Color.Red;
    }
}

结果:当前单元格以红色前景色显示,当前行以AliceBlue背景色显示
private void buttonDiscard_Click(object sender, EventArgs e)
{
    DataGridViewCell cell = this.dataGridView1.CurrentCell;
    DataGridViewRow row = cell.OwningRow;

    if (row.HasDefaultCellStyle)
    {
        row.DefaultCellStyle = null;
        Debug.Assert(!row.HasDefaultCellStyle);
    }
    if (cell.HasStyle)
    {
        cell.Style = null;
        Debug.WriteLine(!cell.HasStyle);
    }
}

结果:当前单元格和当前行以其原始颜色显示

关于c# - 如何将 DataGridViewCellStyle 恢复为其继承的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36545774/

10-15 19:11