我有以下代码
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转换而来的答案 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