C# - Datagridview比较两个单元格值和设置样式

时间:2017-07-25 07:38:52

标签: c# .net winforms datagridview

我正在尝试在DataGridView事件CellFormatting中编写代码,以触发比较同一行中的列(qtyscanqty)值是否不同的逻辑,然后将背景颜色设置为黄色。但是发生运行时错误

  

System.ArgumentOutOfRangeException:'索引超出范围。必须是非负数且小于集合的大小。

以下是我的示例代码,任何人都可以帮助我,非常感谢。

private void dgProductList_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (this.dgProductList.Columns[e.ColumnIndex].Name == "scanqty")
    {
        var sqty = String.IsNullOrEmpty(e.Value.ToString()) ? 0 : int.Parse(e.Value.ToString());
        var qty = int.Parse(dgProductList[e.RowIndex, 1].Value.ToString());

        if (sqty != qty)
        {
            e.CellStyle.BackColor = Color.Yellow;
            e.CellStyle.ForeColor = Color.Red;
        }
        else
        {
            e.CellStyle.BackColor = Color.White;
            e.CellStyle.ForeColor = Color.Black;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

使用[ ]运算符访问DataGridView中的数据语法为:

dgProductList[columnIndex, rowIndex]

enter image description here 你正在以相反的方式做到这一点。请改变这一行:

var qty = int.Parse(dgProductList[e.RowIndex, 1].Value.ToString());

到此:

var qty = int.Parse(dgProductList[1, e.RowIndex].Value.ToString());

另一种可能是使用列名qty

var qty = int.Parse(dgProductList["qty", e.RowIndex].Value.ToString());

答案 1 :(得分:1)

出于性能原因考虑这样的事情:

private void dgProductList_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == COL_INDEX_OF_SCANQTY_COLUMN)
    {
        var sqty = (DATATYPE_OF_SCANQTY)e.Value;
        var qty = (DATATYPE_OF_QTY)dgProductList[1, e.RowIndex].Value;

        if (sqty != qty)
        {
            e.CellStyle.BackColor = Color.Yellow;
            e.CellStyle.ForeColor = Color.Red;
        }
        else
        {
            e.CellStyle.BackColor = Color.White;
            e.CellStyle.ForeColor = Color.Black;
        }
    }
}

你不需要从字符串往返到返回int等。你也很高兴硬编码QTY始终是第1列,但你查找scanqty列的名称并将其与字符串进行比较以检查如果它是scanqty列 - 您也可以使用硬编码

如果您不知道值的数据类型,请在调试器中暂停它并查看..

答案 2 :(得分:1)

由于其他答案可能是正确的,我认为这里的真正问题是e.RowIndexe.ColumnIndex可以是-1(例如标题行)。因此,您必须首先检查这些索引是否为>= 0,并忽略那些-1。

private void dgProductList_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex >= 0 && this.dgProductList.Columns[e.ColumnIndex].Name == "scanqty")
    {
        // ...
    }
}