2017-02-09 13 views
0

は私がDT1に行を追加してれるAcceptChangesを行い、その後、2つのDataTableを比較してdiffrenceを返す方法

例1をDT2に行を追加DT2 = dt1.Copyとを続け、私は2つのDataTable DT1とDT2を考えてみましょう: - 結果上記

dt1     dt2 
    ---------------  --------------- 
    | item | qty |  | item | qty | 
    ---------------  --------------- 
    | Apple | 1 |  | Apple | 1 | 
    | Orange| 1 |  | Orange| 1 | 
    ---------------  | Banana| 2 | 
          --------------- 

Dim dt_compare as DataTable = dt2.GetChanges() 

    dt_compare     
    ---------------  
    | item | qty |   
    ---------------  
    | Banana| 2 | 
    --------------- 

私が得るものであり、それは私も欲しいものですが、例2

例2の表情取るください - 私はちょうどヴァルを変更した場合

dt1     dt2 
    ---------------  --------------- 
    | item | qty |  | item | qty | 
    ---------------  --------------- 
    | Apple | 1 |  | Apple | 1 | 
    | Orange| 1 |  | Orange| 10 | 
    ---------------  --------------- 

Dim dt_compare as DataTable = dt2.GetChanges() 

    dt_compare     
    ---------------  
    | item | qty |   
    ---------------  
    | Orange| 10 | 
    --------------- 

を私はGetChanges()を使うと同じ値を返します。どのようにして10の代わりに9を得ることができますか?

+1

あなたは量の差を求めている。このようなものになるだろうか?すなわち、dt2、あなたはそれを自分でする必要があります。 GetChangesはデータの絶対的な変更を探します。 「違いがありますか?」と表示され、「はい/いいえ」と報告され、変更が一覧表示されます。あなたはそのデータに対して何をしたいのか分かりません。結局のところ、変更は数値フィールド上でさえあります。そして、あなたは何が必要なのか、どうすればいいのでしょうか?しかし、それはあなたに機会を与えました - 今あなたは違いがあることを知って、あなた自身に合わせて自分の計算を行うことができます。 – ADyson

答えて

1

RowVersionで遊んで、好きなことをすることができます。基本的には、変更が変更されているかどうかを確認できます。その場合は、元の値から現在の値を差し引くことができます。

Dim dat1 As DataTable = New DataTable() 
dat1.Columns.Add("item") 
dat1.Columns.Add("qty") 


dat1.Rows.Add(New Object() {"Apple", 1}) 
dat1.Rows.Add(New Object() {"Orange", 1}) 

dat1.AcceptChanges() 
dat1.Rows.Add(New Object() {"Banana", 2}) 
dat1.Rows(1)("qty") = 10 

Dim dtChanges As DataTable = dat1.GetChanges() 
For Each dr As DataRow In dtChanges.Rows 
    If dr.RowState = DataRowState.Modified Then 
     dr("qty") = Convert.ToInt16(dr("qty", DataRowVersion.Current)) - Convert.ToInt16(dr("qty", DataRowVersion.Original)) 

    End If 
Next 

のLINQを使用する代替:

Dim modified = dat1.GetChanges() _ 
        .AsEnumerable() _ 
        .Where(Function(x) x.RowState = DataRowState.Modified) _ 
        .Select(Function(x) New With { 
        .Key = x("item"), 
        .Value = Convert.ToInt16(x("qty", DataRowVersion.Current)) - Convert.ToInt16(x("qty", DataRowVersion.Original))}) _ 
        .ToList() 
+0

ありがとう! – vbnewbie

関連する問題