Я новичок в 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'";
Извиняюсь, я написал это почти полностью из памяти.
Если у вас есть данные, в которых вы не можете агрегировать в 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}" />
результат
Yo должен использовать агрегированный запрос, то есть Group By
string _sql ="Select Label, Sum(Number) As Tot FROM [TableName] Group By Label";
и передать его объекту соединения - посмотрите пример, который я опубликовал: подключение к встроенной SQL Server compact edition (.sdf файл) в приложении WPF (примечание: вместо объектов данных SqlCe вы должны использовать OleDb для работа w/Access mdb). Вам понадобится эта часть, чтобы получить 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
Затем используйте свойство DefaultView
в этом DataTable.