Генерация столбцов в GridView (C#, LINQ)
-
03-07-2019 - |
Вопрос
Ситуация такова, что мне нужно создать таблицу в виде сетки, выглядящую следующим образом:
----------| ID---|---Название--|--1/2002--|--2/2002--|--1/2003--|........| 2/2009 |
Cust1--|
Cust2--|
:
:
У меня есть две таблицы в базе данных: клиенты и заказы через LINQ to SQL DataContext.
Идентификатор и имя клиентов, которых я получаю по простому запросу
var custInfo = from cust in db.Customers
select new { ID = cust.Id,
FullName = cust.FirstName + " " + cust.LastName }
dataGridOrdersPreview.DataSource = custInfo;
И мне нужна подсказка, как сгенерировать эти столбцы в формате t/год, где t указывает на первое или второе полугодие, и назначить этим сгенерированным столбцам заказы каждого клиента в этом сеансе года (отображение только затрат)
[редактировать]
На данный момент я пытаюсь сделать что-то вроде этого:
var orders = from ord in db.Orders
group ord by ord.Id_cust into grouped
let costs = grouped
.Where( s => s.YearSession == session && s.Year == year)
.Select(a => new { Costs = a.Cost ) } )
select new { ID = grouped.Key,
Name = custInfo
.Where( a => a.ID == grouped.Key)
.Select( j => j.Name).Single(),
Cost = ExtensionLibrary.Sum(costs, "\n")
};
(в разделе «Стоимость» отображаются только суммарные затраты за сеанс этого года для каждого клиента)
а затем я думаю о итерации через годы и сессии и получать каким-то образом результаты запроса в соответствующие столбцы
while (year <= DateTime.Today.Year)
{
year++;
while (session < 2)
{
session++;
dataGridOrdersPreview.Columns.Add(session +"/"+ year);
col.Add((session +"/"+ year),
orders.Select( a => a.Cost ).ToList() );
/* col is Dictionary<string, List<string> > */
}
session = 0;
}
Здесь я сгенерировал нужные мне столбцы, и у меня есть заказы в словаре, где ключ — это имя столбца, а значение — это заказы в этом столбце, но мне нужна помощь, привязывающая его к этим столбцам.
Решение
Я видел, как это делается, — это создать класс, имеющий нужные вам свойства, например:
class CustOrders
{
public string CustName {get; set;}
public int Orders2002-1 {get; set;}
public int Orders2002-2 {get; set;}
...
public int Orders2009-1 {get; set;}
}
Затем используйте System.Windows.Forms.BindingSource, назовите его, скажем, CustOrdsBindingSource и установите его DataSource в список вашего нового класса.
List<CustOrders> myListOfCustOrders = new List<CustOrders>();
/* Code to populate myListOfCustOrders */
CustOrdsBindingSource.DataSource = myListOfCustOrders;
В этом случае вам придется написать код для преобразования каждого результата вашего запроса в экземпляр CustOrders и сохранить его в myListOfCustOrders.
Наконец, также необходимо установить источник данных представления сетки:
gridView1.DataSource = CustOrdsBindingSource;
Большая проблема, которую я вижу в этом подходе, заключается в том, что вам придется менять класс CustOrders каждый год, если только не возникнет какой-нибудь шаманской идеи, которую некоторые могут предложить вставить свойства в класс во время выполнения.
В любом случае, я надеюсь, что это послужит вам началом.
Другие советы
Пока не будет обновления/добавления/удаления строк, я думаю, я бы просто сгенерировал эту сетку вручную.
Получите список клиентов и подсчитайте количество продаж в каком году/сессии.А затем в форме возьмите этот список и создайте нужные столбцы.