C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: DataTableにおける特定のキーでの重複行除外


(過去ログ 117 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■68816 / inTopicNo.1)  DataTableにおける特定のキーでの重複行除外
  
□投稿者/ Pla (5回)-(2013/11/19(Tue) 10:27:46)

分類:[.NET 全般] 

-----
Windows 7 64Bit
VisualBasic 2008 Express
-----

お世話になります。
現在、次のような処理を行うプログラムを作成しております。

1.CheckBox付きDataGridViewで、チェックの入った行のみのDataTable(DtChecked)を作成。

2.特定のキー(ここではID)を元に重複行を除外。

3.重複行を除外する際、[Number(個数)]カラムの値を積算し、合計値を算出。
(合計値用のカラム「SumNumber」を作成)

4.別のDataGridViewへ、重複の除外、および「SumNumber」カラムの追加を行ったデータの表示。

ここで、
・重複の除外@では、重複は除外されないが、全ての列が表示される。
・重複の除外Aでは、重複は除外されるが、ID列と、SumNumber列のみになってしまう。
という問題があります。
目的としては、重複が除外され、全ての列が保持され、SumNumber列が追加されたデータの表示です。

良い解決方法が有りましたら、ご教示下さい。

-----コード-----

        'Checkが入った列のみのテーブルを作成
        For I As Integer = 0 To DtMaster.Rows.Count - 1
            If DgvMaster("CheckBox", I).Value = True Then
                'Checkedに追加
                Call DtCopyRow(DtMaster, I, DtChecked)
            End If
        Next

        'テーブル構成のクローン
        Call DtCopyColumn(DtChecked, DtSelected)
        DtSelected.Rows.Clear()

        Dim Columns As String() = New String(DtMaster.Columns.Count - 1) {}
        For I As Integer = 0 To DtMaster.Columns.Count - 1
            Columns(I) = DtMaster.Columns(I).ColumnName
        Next

        '重複を除去するためDataViewを使う
        Dim DtView As New DataView(DtChecked)

        '重複の除外@(除外されない)
        DtSelected = DtView.ToTable(DtChecked.TableName, True, Columns)

        ''重複の除外A(除外されるが、必要な列も消えてしまう)
        'DtSelected = DtView.ToTable("DistinctTable", True, New String() {"ID"})

        '合計の列を追加
        DtSelected.Columns.Add("SumNumber")

        '重複除いたDataTableをループし、元のDataTableから集計値を求める
        For Each Row As DataRow In DtSelected.Rows
            Row("SumNumber") = DtBom.Compute("Sum(Number)", "ID = '" + Row("ID") & "'")
        Next

        'Dgvに表示
        Me.DgvSelected.DataSource = DtSelected

-----コード-----

引用返信 編集キー/
■68821 / inTopicNo.2)  Re[1]: DataTableにおける特定のキーでの重複行除外
□投稿者/ Pla (6回)-(2013/11/19(Tue) 14:27:21)
自己解決致しましたので、報告致します。

ToTableメソッドを使用しての重複除外では、ToTableメソッドの仕様上、残したい列まで消えてしまうのは避けられませんでした。

そこで、重複除外したテーブルと、重複除外前のテーブルを比較し、
合致した行を新たなテーブルにコピーするようプログラムを組み、解決しました。

ご思案頂きありがとうございました。
解決済み
引用返信 編集キー/
■68822 / inTopicNo.3)  Re[1]: DataTableにおける特定のキーでの重複行除外
□投稿者/ shu (423回)-(2013/11/19(Tue) 15:03:15)
No68816 (Pla さん) に返信

LINQを使った例です。
問題なのはIDで重複をチェックとNumberを合計することしか
定義されていないことです。その他の項目はどうするのでしょう?
この例では最初の行を残すようにしてあります。

    Private tbl1 As DataTable

    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        tbl1 = New DataTable
        With tbl1.Columns
            .Add("ID", GetType(String)).DefaultValue = String.Empty
            .Add("Col2", GetType(String)).DefaultValue = String.Empty
            .Add("Num", GetType(Integer)).DefaultValue = 0
            .Add("Check", GetType(Boolean)).DefaultValue = False
        End With
        DataGridView1.DataSource = tbl1
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim qry = From r In tbl1
                   Select ID = r.Field(Of String)("ID"), _
                          Col2 = r.Field(Of String)("Col2"), _
                          Num = r.Field(Of Integer)("Num"), _
                          Check = r.Field(Of Boolean)("Check") _
                   Where Check
                   Group By ID Into Group, SumNum = Sum(Num) _
                       Let FItem = Group.First _
                       Select ID, FItem.Col2, SumNum
        DataGridView2.DataSource = qry.ToList
    End Sub

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -