我正在尝试在DataGridView
事件CellFormatting
中编写代码,以触发比较同一行中的列(qty
和scanqty
)值是否不同的逻辑,然后将背景颜色设置为黄色。但是发生运行时错误
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;
}
}
}
答案 0 :(得分:1)
使用[ ]
运算符访问DataGridView
中的数据语法为:
dgProductList[columnIndex, rowIndex]
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.RowIndex
和e.ColumnIndex
可以是-1(例如标题行)。因此,您必须首先检查这些索引是否为>= 0
,并忽略那些-1。
private void dgProductList_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex >= 0 && this.dgProductList.Columns[e.ColumnIndex].Name == "scanqty")
{
// ...
}
}