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

本文关键字:类型 System 转换 Data DataRowView 异常 无效 对象 | 更新日期: 2023-09-27 18:30:56

>我有以下代码

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语句中的某个地方,所以以防万一我包含了原始代码(注释掉)和我所做的更改(未注释掉)。 我不确定是什么原因造成的,有人可以在语法上为我指出正确的方向

哦,顺便说一下,这是从视觉基础转换的,如果有帮助的话

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

你可以做:

foreach(DataRowView dr in dv)

这应该可以解决问题,DataView中的项目是DataRowView而不是DataRow并且由于foreach执行静默显式转换,因此在编译时看不到错误。(更多在这里)

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

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

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

DataView 不是 DataRow 类型的枚举对象。它不是数组或行列表。它具有可通过 Row 属性 dv.Row 访问的单行。

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

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

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"];
}
相关文章: