在DataView中组合值

时间:2014-06-27 02:27:56

标签: c# wpf

我是wpf的新手。 我试着寻找答案,但很难描述我想要做的事情。

假设我有一个包含以下内容的DataView:

Label  | Number
----------------
Apple  |  1
Orange |  5
Apple  |  2
Orange | 10

“压缩”这些信息的最佳方法是什么? 我的意思是最终结果在ListView + GridView中看起来像这样吗?

Label  | Number
----------------
Apple  |  3
Orange | 15

我正在尝试压缩的数据来自Access数据库。这是通过Visual Studio中的表适配器/数据集读取的。表适配器填充数据集的表,然后我从该数据集表中创建自定义视图。

DBDataSet ds = new DBDataSet ();
DBDataSetTableAdapters.TableNameAdapter adapter = new DBDataSetTableAdapters.TableNameAdapter();

adapter.Fill(ds.TableName);
DataView view = ds.TableName.DefaultView;
view.RowFilter = "[Label] = 'Apple' OR [Label] = 'Orange'";
道歉,我几乎完全是从记忆中写下来的。

2 个答案:

答案 0 :(得分:1)

哟必须使用聚合查询,即分组依据

string _sql ="Select Label, Sum(Number) As Tot FROM [TableName] Group By Label";

并将其传递给连接对象 - 看一下我发布的示例: Connection to Read-only embedded SQL Server compact edition (.sdf file) in WPF application(注意:您应该使用OleDb来使用Access mdb而不是SqlCe数据对象)。您将需要此部分来获取DataTable:

#region private: Get DataTable using SqlCeDataReader
/// <summary>
/// Get DataTable using SqlCeDataReader
/// </summary>
/// <param name="strConn">string</param>
/// <param name="strSQL">string</param>
/// <returns>DataTable</returns>
private static DataTable GetDataTableFromFileCeReader(string strConn, string strSQL)
{
    try
    {
        using (SqlCeConnection _connSqlCe = new SqlCeConnection(strConn))
        {
            using (SqlCeCommand _commandSqlCe = new SqlCeCommand())
            {
                _commandSqlCe.CommandType = CommandType.Text;
                _commandSqlCe.Connection = _connSqlCe;
                _commandSqlCe.CommandText = strSQL;
                _connSqlCe.Open();

                using (SqlCeDataReader _drSqlCe = _commandSqlCe.ExecuteReader()) {
                    DataTable _dt = new DataTable();
                    _dt.Load(_drSqlCe);
                    _connSqlCe.Close();
                    return _dt;
                }
            }
        }
    }
    catch { throw; }
}
#endregion

然后在该DataTable上使用DefaultView属性。

答案 1 :(得分:1)

如果您有一些无法在SQL中聚合的数据,则可以使用以下示例获得相同的结果

    DataTable table = new DataTable();
    table.Columns.Add("Label", typeof(string));
    table.Columns.Add("Number", typeof(int));
    table.Rows.Add(new object[] { "Apple", 1 });
    table.Rows.Add(new object[] { "Apple", 2 });
    table.Rows.Add(new object[] { "Orange", 5 });
    table.Rows.Add(new object[] { "Orange", 10 });

    var CombinedView = from rowGroup in table.Rows.OfType<DataRow>().GroupBy(r => r.Field<string>("Label"))
                       select new { Label = rowGroup.Key, Number = rowGroup.Sum(r => r.Field<int>("Number")) };

    var CombinedView = from row in table.Rows.OfType<DataRow>()
                       group row.Field<int>("Number") by row.Field<string>("Label") into rowGroup
                       select new { Label = rowGroup.Key, Number = rowGroup.Sum() };

想法是按标签列对行进行分组,并对该组中的值求和。

现在您可以将其绑定到数据网格或您选择的任何项目控件

例如

    <DataGrid ItemsSource="{Binding CombinedView}" />

结果

result