Объединение значений в DataView

1

Я новичок в 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
    Не могли бы вы опубликовать свои классы данных, чтобы мы могли создать образец для вас. Также было бы неплохо иметь шаблон данных xaml.
Теги:
wpf

2 ответа

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}" />

результат

Изображение 174551

1

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.

  • 1
    Отлично, спасибо
  • 0
    Добро пожаловать! Удачи! Rgds,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню