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

时间:2016-01-18 20:50:01

标签: c#

我有以下代码

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;

}

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

  

无效的投射例外        - 无法转换对象类型' System.Data.DataRowView'输入' System.Data.DataRow'

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

哦,顺便说一下,如果这有助于任何

,那么这是从visual basic转换而来的

3 个答案:

答案 0 :(得分:2)

你可以这样做:

foreach(DataRowView dr in dv)

这应该可以解决问题,DataView中的项目是DataRowView而不是DataRow,而foreach进行无声显式转换,您在编译时没有看到错误。 (更多here

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

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

如果您希望在字符串前面加,,那么您可以在string.Join之前使用连接

答案 1 :(得分:1)

DataRowView无法转换为DataRow。您可以在DataRowView中使用DataRow代替foreach。像这样:

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"];
}

答案 2 :(得分:1)

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

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

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