C# 使用两种不同类型的运算符

C# 使用两种不同类型的运算符,c#,datatables,dataview,C#,Datatables,Dataview,我有一个已经创建的数据视图。我从现有的DataView构建了一个新的DataTable,并将该数据作为DataView导出到XlSX中。我试图检查最后一列是否有一个大于0的整数。如果是,则应删除该行。因为这是两种不同的类型,一种是对象,另一种是双重对象,所以不像我想的那么简单 我已经研究了运算符“的答案,结果表明,本质上,OP是需要的 您不是在看第一行,而是在创建一个新行,该行的列与您的DataTable相同,并且正在看它。在显式添加新行之前,该新行甚至不会出现在DataTable中 var d

我有一个已经创建的数据视图。我从现有的DataView构建了一个新的DataTable,并将该数据作为DataView导出到XlSX中。我试图检查最后一列是否有一个大于0的整数。如果是,则应删除该行。因为这是两种不同的类型,一种是对象,另一种是双重对象,所以不像我想的那么简单


我已经研究了运算符“的答案,结果表明,本质上,OP是需要的

您不是在看第一行,而是在创建一个新行,该行的列与您的DataTable相同,并且正在看它。在显式添加新行之前,该新行甚至不会出现在DataTable中

var dr = result.NewRow();
dr
中的值都是空的,因为您刚刚创建了可怜的东西。您也没有检查列是否为null,这是您应该做的

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

事实证明,本质上,OP是想要的

您不是在看第一行,而是在创建一个新行,该行的列与您的DataTable相同,并且正在看它。在显式添加新行之前,该新行甚至不会出现在DataTable中

var dr = result.NewRow();
dr
中的值都是空的,因为您刚刚创建了可怜的东西。您也没有检查列是否为null,这是您应该做的

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循环。我对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;
}
private DataView createExtactionDataView()
{
DataTable dt=BuildFufillmentDataTable();
DataView dv=新数据视图(dt,“,”部门,日期“,DataViewRowState.CurrentRows);
数据表结果=dv.ToTable(真,“部门”、“日期”、“剩余”);
/*对于(int i=result.Rows.Count-1;i>=0;i--)
{
如果(result.Rows.Count>0)
{
var firstrow=result.Rows[i];
如果(第一行[“剩余”]!=DBNull.Value
&&Convert.ToDouble(第一行[“剩余”])>0.0)
{
Delete();
}
}
}*/ 

DataView-dvresult=new-DataView(result,“Remaining我发现了一种方法,可以简单地对数据表进行排序,而不使用前面讨论过的For循环。我对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;
}
private DataView createExtactionDataView()
{
DataTable dt=BuildFufillmentDataTable();
DataView dv=新数据视图(dt,“,”部门,日期“,DataViewRowState.CurrentRows);
数据表结果=dv.ToTable(真,“部门”、“日期”、“剩余”);
/*对于(int i=result.Rows.Count-1;i>=0;i--)
{
如果(result.Rows.Count>0)
{
var firstrow=result.Rows[i];
如果(第一行[“剩余”]!=DBNull.Value
&&Convert.ToDouble(第一行[“剩余”])>0.0)
{
Delete();
}
}
}*/ 

DataView dvresult=new DataView(result,“剩余1”)这不会编译:
if(>=0.0)
。请提供将编译的代码。2)引发异常的具体行是什么?我更新了代码,它只在if语句行出错。在将
dr[“剩余”]
传递到Convert.ToDouble()之前,请检查
dr[“剩余”]==DBNull.Value
首先。如果它等于DBNull.Value,那么它是null,您将得到此异常。您不会从数据库列中得到一个关于null值的常规
null
,只是那个特殊常量。嘿,等一下,您正在创建一个充满null的新行并查看它。当然它是null。您想要结果中的第一行:
var firstrow=result.Rows.FirstOrDefault()
,并检查
firstrow
是否为null。1)这不会编译:
if(>=0.0)
。请提供将编译的代码。2)引发异常的具体行是什么?我更新了代码,它只在if语句行出错。在传递
dr[“剩余”]
要转换.ToDouble(),请检查
dr[“剩余”]==DBNull.Value
首先。如果它等于DBNull.Value,那么它是null,您将得到此异常。您不会从数据库列中得到一个关于null值的常规
null
,只是那个特殊常量。嘿,等一下,您正在创建一个充满null的新行并查看它。当然它是null。您想要结果中的第一行:<代码>var firstrow=result.Rows.FirstOrDefault()
,并检查
第一行
是否为空。如果该行的整数大于0,则这两种方法都不会删除该行,但这至少会使该行不会引发异常,并为我指出正确的方向。谢谢!好的,找出它是什么。这实际上只会删除第一行。如果我希望它通过并执行此操作,请所有行都必须放在for循环中吗?@AverageJoe是的,你需要一个循环。我猜我误解了你代码的意图。另外,你想从结果对象或实际的DB表中删除吗?基本上,我只是想让XLSX文件在[“剩余”]中只包含负数列。它可以保留在表中,并将其从结果中删除就可以了。仅从整个DB表中删除它会更有效吗?我希望从结果中删除它会更简单。我认为您可能也可以在其上设置一个筛选器-甚至更简单。如果该行的整数大于0,则这两种方法都不会删除该行,但是s至少能让它不抛出异常,并为我指出正确的方向。谢谢!好的,找出它是什么。这实际上只做第一行。如果我想让它通过并对所有行执行此操作,它是否必须被放入for循环中?@AverageJoe是的,你需要一个循环。我猜我误解了它的意图您希望从结果对象或实际数据库中删除吗