首页 文章

无效的强制转换异常 - 无法将对象类型'System.Data.DataRowView'强制转换为'System.Data.DataRow'

提问于
浏览
0

我有以下代码

public void ConstructUpdateableInventoryItemsOnThisPage(DataView dv)
{
    //DataRowView dv = null;
    string sTemp = "";

    foreach (DataRow dr in dv)
    {
        if (sTemp.Length > 0)
        {
            sTemp += ",";
            sTemp += dr["inventory_id"];
        }
    }

    //foreach (DataRow dr in dv)
    //{
    //    if (sTemp.Length > 0)
    //        sTemp += ",";
    //    sTemp += dr.ItemArray[Convert.ToInt32("inventory_id")];  //added ItemArray keyword, square brackets and syntax to convert from string to int 10/21/15 Max //

    //}



    mUpdateableInventoryItemsOnThisPage = sTemp;

}

当我去执行代码时,我收到以下错误:

无效的Cast异常 - 无法将对象类型'System.Data.DataRowView'转换为'System.Data.DataRow'类型

我知道问题出现在 foreach 语句中的某处,以防我包含原始代码(已注释掉)以及我所做的更改(未注释掉) . 我不确定是什么导致这可能有人指出我在语法上正确的方向

哦顺便说一句,这是从视觉基础改变的,如果这有助于任何

3 回答

  • 2

    DataRowView 不可转换为 DataRow . 您可以在 foreach 中使用 DataRowView 而不是 DataRow . 像这样:

    foreach (DataRowView dr in dv)
    {
         if (sTemp.Length > 0)
         {
              sTemp += ",";
              sTemp += dr.Row["inventory_id"];
         }
    }
    

    或者作为LINQ的更好解决方案:

    foreach (DataRowView dr in dv.Cast<DataRowView>().Where(dr => sTemp.Length > 0))
    {
        sTemp += ",";
        sTemp += dr.Row["inventory_id"];
    }
    
  • 1

    你可以做:

    foreach(DataRowView dr in dv)
    

    这应该解决问题, DataView 中的项目是 DataRowView 而不是 DataRowsince foreach does a silent explicit conversion ,您在编译时看不到错误 . (更多here

    您还可以使用 String.Join 获取所需的字符串,如:

    sTemp = String.Join(",", 
                    dv.OfType<DataRowView>().Select(dr => 
                                                    Convert.ToString(dr["inventory_id"])));
    

    如果你想在你的字符串前面有 , 那么你可以在 string.Join 之前使用连接

  • 1

    DataView不是DataRow类型的可枚举 . 它不是数组或行列表 . 它有一行可以使用Row属性dv.Row访问 .

    您可以爬上层次结构并向下返回行:dv.Table.Rows

    https://msdn.microsoft.com/en-us/library/system.data.datarowview.dataview(v=vs.110).aspx

相关问题