«Поворот» данных в сетке данных WinForms - PullRequest
0 голосов
/ 23 марта 2009

Используя Winforms .NET 2.0, мой клиент запросил отображение данных в сетке данных по вертикали, а не по горизонтали. Уровень данных приложения построен на NHibernate, поэтому я обычно избегаю написания необработанного SQL в пользу HQL. Однако этот сценарий может быть полезен для использования функциональности «кросс-таблица» SQL Server 2005.

Так, например, текущий макет gridview (который отражает дизайн таблицы) привязан к IList (из ClaimGroup) следующим образом:


GroupName | ClaimType | PlanCode | AgeFrom | AgeTo | AgeSpan<br>
BHFTConv 1| P         | CC       | 6       | 12    | Years

должно стать:


GroupName  | BHFTConv 1
ClaimType  | P
PlanCode   | CC
AgeFrom    | 6
AgeTo      | 12
AgeSpan    | Years

В настоящее время сетка имеет и будет по-прежнему требовать кнопку «Применить», которая сохранит все изменения, сделанные в повернутой сетке.

Так что бы вы сделали? Использовать сырой SQL для перекрестной таблицы данных, нарушая тем самым закон NHibernate, позволяющий избегать специфичных для БД запросов? Или в DataSet встроен какой-то механизм, позволяющий вращать данные? Или просто использовать грубую силу для поворота данных?

заранее спасибо

Ответы [ 3 ]

1 голос
/ 28 марта 2009

Я бы использовал виртуальный режим просмотра данных.
Свойство VirtualMode = True

Когда вы загрузили данные как обычно
Создайте 2 столбца и подготовьте обзор данных

DataGridView.Columns.Add("colGroup", "Group");
DataGridView.Columns.Add("colBVH", "BVH");
DataGridView.Rows.Clear();
DataGridView.Rows.Add(6);
DataGridView.CellValueNeeded +=
  new DataGridViewCellValueEventHandler(NeedValue);

Теперь реализуем событие CellValueNeeded.

private void NeedValue(object sender, DataGridViewCellValueEventArgs e)
{
    e.Value
    e.ColumnIndex
    e.RowIndex
}

Используйте rowindex и columnindex, чтобы установить значение, которое должно отображаться. Вы знаете, какое свойство основано на значении строки, а какое на основе значения столбца.

0 голосов
/ 29 марта 2009

Рассматривали ли вы использование DataList вместо DataGridView?

0 голосов
/ 28 марта 2009

У меня есть такое же требование для поворота сетки, как и для репликации QueryWizard в ASP.NET, и данные более управляемы, если перевернуть их на бок.

Мой прототип состоял из повторителя, который выводил строки из вертикальных строк, но форматирование немного запутано, если у вас непредсказуемые длины данных, поскольку в таблицах должны быть заданы высота строки, ширина и переполнение: скрытое, чтобы отображаться в форме. - но я думаю, простого нобра было бы достаточно.

<HeaderTemplate>
   <table>
   <tr><td>
         <table>
         <tr><td>ColumnName1</td></tr>
         <td><td>ColumnName2</td></tr>
         </table>
       </td>
</HeaderTemplate>
<ItemTemplate>
       <td>
         <table>
         <tr><td><%# Eval("Column1") %></td></tr>
         <tr><td><%# Eval("Column2") %></td></tr>
         </table>
       </td>
</ItemTemplate>
<FooterTemplate>
    </tr>
    </table>
</FooterTemplate>

Мой план атаки на понедельник состоял в том, чтобы переопределить метод рендеринга GridView и затем зациклить строки, чтобы они отображались по мере необходимости. Я отправлю обратно, чтобы сообщить вам о моем прогрессе

псевдокод - что-то вроде

for(int c=0; c < columns.Count; c++)
{
   writer.Write("<tr>");
   writer.Write("<td>" + columns[c].Title + "</td>");

   for(int r=0; r < rows.Count; r++)
   {
       rows[r].Cells[c].render(writer);
   }

   writer.Write("</tr>");
}

Позволяя ячейке обрабатывать рендеринг, вам не нужно делать ничего другого с Binding или ViewState.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...