>我有以下代码
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
语句中的某个地方,所以以防万一我包含了原始代码(注释掉)和我所做的更改(未注释掉)。 我不确定是什么原因造成的,有人可以在语法上为我指出正确的方向
哦,顺便说一下,这是从视觉基础转换的,如果有帮助的话
你可以做:
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"];
}