使用具有两种不同类型的运算符

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