在DataGridView单元格中比较旧值和新值

15

如何根据新单元格值是大于还是小于当前/旧单元格值来更改DataGridView单元格的ForeColor?是否有一种事件可以传递新值而不改变当前值,以便我可以比较它们?

数据从底层源更新,可能由BindingSource绑定。

5个回答

27

我遇到了类似的问题。我通过使用CellValidating事件来解决:

void dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    var oldValue = dgv[e.ColumnIndex, e.RowIndex].Value;
    var newValue = e.FormattedValue;
}

诚然,我只需要访问旧值,而不需要执行任何格式化。虽然我相信您可以通过此事件处理程序应用格式化。


0
如果DataGridView控件的内部源是DataTable,则可以使用DataRowVersion枚举来利用旧版本的DataRow。请注意,我已经利用了CellFormatting事件。
示例:
private void DataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    // if NOT the DataGridView's new row
    if (!this.dataGridView1.Rows[e.RowIndex].IsNewRow)
    {
        // if my desired column
        if (e.ColumnIndex == 0)
        {
            TestDataSet.TestRow row;

            row = (TestDataSet.TestRow)((DataRowView)this.dataGridView1.Rows[e.RowIndex].DataBoundItem).Row;

            if (row.Column1, (int)row["Column1", DataRowVersion.Original]) > 0)
                    e.CellStyle.ForeColor = Color.Red;
        }
    }
}

0

您可能需要查看 DataGridView.CellValueChanged 事件 (http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridview.cellvaluechanged.aspx)。

如果您想在保存值之前检查它,则可以查看 DataGridView.CurrentCellDirtyStateChanged (http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridview.currentcelldirtystatechanged.aspx)。


-1
    private double CuerrLineQty;
    private void GridTransaction_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        if (currOp != CurrentOperation.FillDone)
            return;

        CuerrLineQty = double.Parse(GridTransaction.Rows[e.RowIndex].Cells["DisplayQty"].Value.ToString());
        
        CuerrLineQty = double.Parse(GridTransaction.Rows[e.RowIndex].Cells["DisplayQty"].FormattedValue.ToString());

        CuerrLineQty = double.Parse(GridTransaction.Rows[e.RowIndex].Cells["DisplayQty"].EditedFormattedValue.ToString());

    }

屏幕截图


-1

您可以将单元格的旧值存储在变量中,根据结果比较和更改ForeColor,然后从变量中删除旧值。

谢谢。


我本来希望能避免这种情况,因为我需要很多列,但如果没有更简单的方法... - bretddog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接