我是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'";
道歉,我几乎完全是从记忆中写下来的。
答案 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}" />
结果