Генерация столбцов в GridView (C #, LINQ) - PullRequest
0 голосов
/ 04 мая 2009

Ситуация такова, что мне нужно создать таблицу в виде сетки, которая выглядит следующим образом:

---------- | ID --- | --- Name-- | --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 / year, где 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;
        }

Здесь я сгенерировал нужные мне столбцы, и у меня есть заказы в словаре, где Key - это имя столбца, а Value - заказы в этом столбце, но мне нужна помощь, чтобы связать его с этими столбцами

Ответы [ 2 ]

0 голосов
/ 05 мая 2009

Пока не будет обновления / добавления / удаления строк, я думаю, что я просто сгенерирую эту сетку вручную.

Получить список клиентов и подсчитать, сколько продаж за какой год / сессия. А затем в форме возьмите этот список и создайте необходимые столбцы.

0 голосов
/ 04 мая 2009

То, как я это сделал, - создать класс со свойствами, которые вы хотите, например,

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 каждый год, если только не существует какого-либо вуду, которое некоторые могут предложить вставить в класс во время выполнения.

В любом случае, я надеюсь, это даст вам начало.

...