2012-02-21 78 views
1

我有一個C#應用程序,我有DataGridView,我可以綁定到數據源或動態加載數據,但與我需要做什麼無關。通過DataGridView循環並添加行的位置檢查值

到Illustarte - 我有三欄。第一列是一個複選框,後面跟着一個不唯一的ID列,可以包含duplciates,然後是一個金額列。

我需要將數據加載到單獨的行中,所以我不想在填充DataGridView之前積累數據集,因爲用戶將選擇要標記的值,所以我想循環訪問datagridview並檢查所有已檢查行,累積或總結ID的數量列相同。

作爲一個例子,下面是一個數據樣本。 ID金額
1 50.25
2 15.20
3 66.95
1 12.01
3 15.15
1 85.27

如果我們假設第2條記錄的ID 1被選中,我通過要循環在DataGridView和用量添加在一起,並有一個量對於所有檢查行
但在這種情況下爲ID 1(50.25 + 12.01 = 62.26)

任何推薦離子?

感謝您提前。

+0

你是什麼在這裏遇到麻煩?循環使用網格的行集合或通過備份數據源應該可以正常工作。 – 2012-02-21 21:24:27

回答

0

如果你有LINQ,那麼沿着這些線的東西可能會工作(沒有任何代碼)。顯然它需要修改你自己的代碼,但是這個想法就在那裏。你可以從中得到每個分組的總和。

ListOfDataRows.Where(x => x.Checked) 
    .GroupBy(x=>x.ColumnWithId) 
    .Sum(x => x.ColumnWithValue); 
0

您可以使用LINQ來完成所有的計算:

var summedRows = yourDataGridView 
    .Cast<DataGridViewRow>() 
    .Where(r => (bool)r.Cells[0].Value == true) 
    .GroupBy(r => r.Cells[1].Value) 
    .Select(g => new 
     { 
      Id = g.Key, 
      Sum = g.Sum(r => (double)r.Cells[2].Value) 
     } 
    ); 

所有你現在需要做的就是這樣的價值觀建立新的DataGridViewRows收集築底。

編輯:

如果您的網格包含「添加新行」啞行(最後一個),要跳過它在您的查詢:

var summedRows = yourDataGridView 
    .Cast<DataGridViewRow>() 
    .Take(yourDataGridView.Rows.Count - 1) 
    // rest same as above