将sqlite表格式化为在C#Datagrid中自定义显示

时间:2015-10-14 15:51:33

标签: c# sqlite datagrid

我有一个像下面这样的表的Sqlite数据库,但我想在c#中使用Windows窗体在数据网格中显示

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 个答案:

答案 0 :(得分: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");