2015-10-14 59 views
0

我有一個SQLite數據庫白衣的表像之下,但我婉使用Windows窗體在C#在DataGrid中顯示格式SQLite表自定義顯示在C#中的Datagrid

Warehouse Product Amount 
========= ======= ====== 
1   p1  1 
1   p2  2 
1   p3  3 
2   p1  4 
2   p2  5 
2   p3  6 
3   p1  7 
3   p2  8 
3   p3  9 

我要顯示這樣

Warehouse p1 p2 p3... 
========= == == == 
1   1 2 3 
2   4 5 6 
3   7 8 9 

我用這個代碼,以填補像一個例子中,數據網格

DataSet dataSet = new DataSet(); 
    var sql = "select Warehouse, Product,Amount from existencias_dump"; 

    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(sql, db.m_dbConnection); 
    dataAdapter.Fill(dataSet); 
    var table = dataSet.Tables[0]; 

    dataGridView1.DataSource = dataSet.Tables[0].DefaultView; 

我想顯示像第二個,但不知道是建議的更改在SQLite查詢或在最終數據集在這兩種情況下,我不知道如何處理

回答

1

查詢和結果集都可以。問題是你需要的東西(稱爲交叉表格或透視圖)並不是由DataGridView組件(和許多其他組件)原生支持的。幸運的是,你問的仍然是可行的方法很多,包括(但不限於)手動創建網格列和行,並用數據填充它們,或用東西轉換數據表預期的格式是這樣

static DataTable ToCrossTab(DataTable source, string rowField, string columnField, string valueField) 
{ 
    var rowSource = source.Columns[rowField]; 
    var columnSource = source.Columns[columnField]; 
    var valueSource = source.Columns[valueField]; 
    var table = new DataTable(); 
    // Columns 
    table.Columns.Add(rowSource.ColumnName, rowSource.DataType); 
    foreach (var columnName in source.AsEnumerable().Select(dr => dr[columnSource].ToString()).Distinct().OrderBy(name => name)) 
     table.Columns.Add(columnName, valueSource.DataType); 
    // Rows 
    foreach (var group in source.AsEnumerable().GroupBy(dr => dr[rowSource]).OrderBy(g => g.Key)) 
    { 
     var row = table.Rows.Add(group.Key); 
     foreach (var dr in group) 
      row[dr[columnSource].ToString()] = dr[valueSource]; 
    } 
    return table; 
} 

並將最後一行更改爲

dataGridView1.DataSource = ToCrossTab(table, "Warehouse", "Product", "Amount");