2015-10-14 23 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");