使用具有两种不同类型的运算符
Using Operators with two different Types
我有一个已经创建的 DataView。我从现有的 DataView 构建了一个新的 DataTable,并将该数据制作成一个 DataView 以在 XlSX 中导出。我正在尝试检查并查看最后一列是否有一个大于 0 的整数。如果有,它应该删除该行。由于这是两种不同的类型,一种是对象,另一种是双精度类型,所以并不像我想的那么简单。
我已经在 Operator '<' cannot be applied to operands of type 'object' and 'int'
上查看了答案
在大多数情况下,这会做到这一点,但是在某处它 returns 一个 DBNull.Value 如上所述。如果我尝试解析它似乎不喜欢它并且它不会构建。
private DataView CreateExhaustionDataView()
{
DataTable dt = BuildFufillmentDataTable();
DataView dv = new DataView(dt, "", "Department,Date", DataViewRowState.CurrentRows);
DataTable result = dv.ToTable(true,"Department","Date","Remaining");
var dr = result.NewRow();
if (Convert.ToDouble(dr["Remaining"]) >= 0.0)
{
dr.Delete();
}
DataView dvresult = new DataView(result);
return dvresult;
}
我在尝试转换时收到此错误消息:
System.InvalidCastException: 'Object cannot be cast from DBNull to other types.'
I only receive this error when it goes to export the data.
As far as parsing it does not build at all.
如有任何我错过的提示或路线,我将不胜感激!
事实证明,OP 本质上想要 to filter result
。
您不是在查看第一行,而是在创建一个新行,其中的列与您的 DataTable 相同,然后查看它。在您明确添加新行之前,它甚至不会出现在 DataTable 中。
var dr = result.NewRow();
dr
中的值都是空的,因为你刚刚创建了这个可怜的东西。您也没有检查该列是否为空,而您应该这样做。
if (result.Rows.Count > 0)
{
var firstrow = result.Rows[0];
if (firstrow["Remaining"] != DBNull.Value
&& Convert.ToDouble(firstrow["Remaining"]) >= 0.0)
{
// Or maybe firstrow.Delete(), I don't have time to test this.
// If one doesn't work, try the other.
result.Rows.Remove(firstrow);
}
}
我找到了一种无需使用前面讨论的 For 循环即可对数据进行简单排序的方法 table。我将 For 循环注释掉以测试排序,并且实际上在没有那么多代码行的情况下也能正常工作。
private DataView CreateExhaustionDataView()
{
DataTable dt = BuildFufillmentDataTable();
DataView dv = new DataView(dt, "", "Department,Date", DataViewRowState.CurrentRows);
DataTable result = dv.ToTable(true, "Department", "Date", "Remaining");
/*for (int i= result.Rows.Count-1; i >= 0; i--)
{
if (result.Rows.Count > 0)
{
var firstrow = result.Rows[i];
if (firstrow["Remaining"] != DBNull.Value
&& Convert.ToDouble(firstrow["Remaining"]) > 0.0)
{
firstrow.Delete();
}
}
}*/
DataView dvresult = new DataView(result, "Remaining <= 0", "Department, Date", DataViewRowState.CurrentRows);
return dvresult;
}
我有一个已经创建的 DataView。我从现有的 DataView 构建了一个新的 DataTable,并将该数据制作成一个 DataView 以在 XlSX 中导出。我正在尝试检查并查看最后一列是否有一个大于 0 的整数。如果有,它应该删除该行。由于这是两种不同的类型,一种是对象,另一种是双精度类型,所以并不像我想的那么简单。
我已经在 Operator '<' cannot be applied to operands of type 'object' and 'int'
上查看了答案在大多数情况下,这会做到这一点,但是在某处它 returns 一个 DBNull.Value 如上所述。如果我尝试解析它似乎不喜欢它并且它不会构建。
private DataView CreateExhaustionDataView()
{
DataTable dt = BuildFufillmentDataTable();
DataView dv = new DataView(dt, "", "Department,Date", DataViewRowState.CurrentRows);
DataTable result = dv.ToTable(true,"Department","Date","Remaining");
var dr = result.NewRow();
if (Convert.ToDouble(dr["Remaining"]) >= 0.0)
{
dr.Delete();
}
DataView dvresult = new DataView(result);
return dvresult;
}
我在尝试转换时收到此错误消息:
System.InvalidCastException: 'Object cannot be cast from DBNull to other types.' I only receive this error when it goes to export the data. As far as parsing it does not build at all.
如有任何我错过的提示或路线,我将不胜感激!
事实证明,OP 本质上想要 to filter result
。
您不是在查看第一行,而是在创建一个新行,其中的列与您的 DataTable 相同,然后查看它。在您明确添加新行之前,它甚至不会出现在 DataTable 中。
var dr = result.NewRow();
dr
中的值都是空的,因为你刚刚创建了这个可怜的东西。您也没有检查该列是否为空,而您应该这样做。
if (result.Rows.Count > 0)
{
var firstrow = result.Rows[0];
if (firstrow["Remaining"] != DBNull.Value
&& Convert.ToDouble(firstrow["Remaining"]) >= 0.0)
{
// Or maybe firstrow.Delete(), I don't have time to test this.
// If one doesn't work, try the other.
result.Rows.Remove(firstrow);
}
}
我找到了一种无需使用前面讨论的 For 循环即可对数据进行简单排序的方法 table。我将 For 循环注释掉以测试排序,并且实际上在没有那么多代码行的情况下也能正常工作。
private DataView CreateExhaustionDataView()
{
DataTable dt = BuildFufillmentDataTable();
DataView dv = new DataView(dt, "", "Department,Date", DataViewRowState.CurrentRows);
DataTable result = dv.ToTable(true, "Department", "Date", "Remaining");
/*for (int i= result.Rows.Count-1; i >= 0; i--)
{
if (result.Rows.Count > 0)
{
var firstrow = result.Rows[i];
if (firstrow["Remaining"] != DBNull.Value
&& Convert.ToDouble(firstrow["Remaining"]) > 0.0)
{
firstrow.Delete();
}
}
}*/
DataView dvresult = new DataView(result, "Remaining <= 0", "Department, Date", DataViewRowState.CurrentRows);
return dvresult;
}