DataGridViewRow dr = new DataGridViewRow();
                dr.SetValues(obj);                if (obj[18].ToString().StartsWith("-"))
                {
                   //.........
                }
                else if(obj[18].ToString()!="0")                {
                    dr.Cells[18].Style.ForeColor = Color.Red;//这里报错:索引超出范围。必须为非负值并小于集合大小。
参数名: index
               }

解决方案 »

  1.   

    在这行加个断点,监视dr.Cells的个数dr.Cells[18].Style.ForeColor = Color.Red;//这里报错:索引超出范围。必须为非负值并小于集合大小。
    参数名: index
      

  2.   

    你可以new后把dr.Cells的个数用MessageBox弹出来,看看。
      

  3.   

    dr.Cells[18]. 这个最好用字段名 dr.cells[""].Value ,之前,还可以判断下字段名是否存在。
    datatable.Columns.Contain("");
    或datagridivew.columns.contains("");
      

  4.   

    DataGridViewRow.SetValues 方法的备注values 参数表示用于填充行中的单元格值的数目不定的变量。这些值可以作为多个、单个参数或作为单个 Array 的成员传递给此方法。因为这些值应该是 Object 类型的实例,所以,如果传递的是一组值类型的值(例如 Int32 值),则此方法会将该数组视为单个对象并将其分配给单个单元格。若要避免这一行为,您必须将值类型数组强制转换为 Object 数组或传递多个值作为多个参数。如果 values 列表中的值的数目大于要初始化的单元格的数目,则此方法会忽略多余的值并返回 false。如果无法设置任何指定的值,此方法也会返回 false。如果值的数目小于单元格的数目,则剩下未匹配的单元格将保留各自的当前值。DataGridViewRow dr = new DataGridViewRow();
    你没有为 dr 设置 RowTempate 模板 所以 Cells.Count 应该为 0(未测试)
    所以 SetValues 根本没起作用