【问题标题】:how to subtract two datatables?如何减去两个数据表?
【发布时间】:2016-07-28 17:59:39
【问题描述】:

我想减去两个数据表。我想要的是下面的图片。

我有以下代码,我在最后一点堆叠。这是我想在代码中做的事情。

当我单击 Button1 时,它会将当前数据放入 firstDsData。几秒钟后,当我单击 Button2 时,它会将当前数据上传到 secondDsData 并将其合并在一起。然后它们将合并到 FinalDsData 中。差异数据表将从 finaldsdata 中获取更改。

问题在最后一节。 FinalDsData.GetChanges() 不起作用。它说空引用异常。我还尝试使用 RowState.Unchanged/Modified() 进行更改。他们也没有工作。

    DataTable firstDsData = new DataTable();
    DataTable secondDsData = new DataTable();
    DataTable finalDsData = new DataTable();
    DataTable DifferenceDataTable = new DataTable();

    private void Form1_Load(object sender, EventArgs e)
    {
        this.dataTable1TableAdapter.Fill(this.dataWE.DataTable1);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        firstDsData = dataTable1TableAdapter.GetData();

    }

    private void button2_Click(object sender, EventArgs e)
    {
        secondDsData = dataTable1TableAdapter.GetData();

        finalDsData.Merge(firstDsData);
        finalDsData.AcceptChanges();
        finalDsData.Merge(secondDsData); //Until here i can get data into finalDsData. No Problem.
        DifferenceDataTable = finalDsData.GetChanges(); // Problem in here.Nullreferenceexception
        ultraGrid2.SetDataBinding(DifferenceDataTable, DifferenceDataTable.TableName);
    }

【问题讨论】:

    标签: c# .net winforms datatable


    【解决方案1】:

    如果您的唯一目标是在网格上显示更改,那么您可以使用 LINQ 查找两个表之间的差异,例如:

    var changes = (from dr1 in firstDsData.AsEnumerable()
        from dr2 in secondDsData.AsEnumerable()
        where dr1.Field<string>("Name") == dr2.Field<string>("Name")
        select new
        {
            Name = dr1.Field<string>("Name"),
            Value = dr1.Field<decimal>("Value") - dr2.Field<decimal>("Value")
        }).ToList();
    

    要将其显示到您的网格中,您可以这样做:

    ultraGrid2.DataSource = changes;
    

    如果您想要DataTable 作为输出,那么您可以将您的 LINQ 结果转换为DataTable,请参阅Convert select new to DataTable?

    【讨论】:

    • 我更改了这样的代码pastebin.com/Wkfkpjdw。它在“选择新”开始时抛出一个错误,提示“System.Data.DataSetExtensions.dll 中发生了“System.InvalidCastException”类型的未处理异常
    • @P.Exal,你知道第二列Value的数据类型吗,我假设它是十进制的,可能是doublefloat,检查DataType然后替换在上面的代码中代替decimal
    • 谢谢哈比布。有用。作为一种表演,以这种方式使用是否有效?此代码每秒运行一次。
    • @P.Exal,这取决于Data,如果数据过多,可能会对性能造成一些影响。这是由你衡量和决定的。我不确定做同样事情的任何其他过程是否会带来显着的性能提升
    • 你好。如何从 toList linq 获取特定行值的值?例如,我只想获取“水”并希望将其显示到文本框中
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2021-08-12
    • 2021-12-07
    • 1970-01-01
    • 2022-08-06
    相关资源
    最近更新 更多