|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
Доброго здоровья уважаемые посетители форума! Недавно я встала на пусть познания Net и С#. И вот столкнулась с проблемой: Есть public class Person { int key {get; set;} string name {get; set;} string department {get; set;} ...... } и List<Person> отображается в GridControle (DevExpress) мне поставили задачу изменить представление данные в гиде таким образом, что бы departament (отделы) были в колонках, то есть вроде обычная задача строки развернуть в столбцы. То есть получим public class PersonByDepartment { int key {get; set;} string name {get; set;} bool departmentA {get; set;} bool departmentB {get; set;} bool departmentC {get; set;} ...... } Но как сформировать List<PersonByDepartment> для отображения в GridControl, когда неизвестно заранее кол-во полей departament. Насколько я поняла в С# нельзя динамически добавлять свойства. Остается только создавать класс с помощью рефлексии или еще какой-нибудь путь есть? Подскажите в каком направлении почитать? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 12:28 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
_Алиса_, а можно поинтересоваться почему нельзя отделы, к которым приписана персона, отображать списком через запятую в одной колонке? Это бы упростило Вашу задачу напорядок. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 13:21 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
Потому-что заказчик желает видеть в таком разрезе "и точка") Просто принято у них такая форма и все тут. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 13:32 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
_Алиса_Потому-что заказчик желает видеть в таком разрезе "и точка") Просто принято у них такая форма и все тут. Ну тогда что-то типа Код: c# 1. 2. 3. 4. 5. 6. 7.
И каким-то демоническим способом замапить список к столбцам. Надеюсь, список подразделений ограничен и не меняется? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 13:33 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
_Алиса_, начнем с того, что мне не кажется что Ваша структура классов при отношении многие-ко-многим правильна. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 13:34 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
PallarisНу тогда что-то типа Код: c# 1. 2. 3. 4. 5. 6. 7.
Тут сперва надо понять что есть поле name в данном классе, при том что класс Person уже существует. И видимо забыто, что отношение many-to-many. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 13:36 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
_Алиса_, ищите по словам Pivot GridControl... может что и найдете... если нет... гуглить по c# pivot list of objects ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 13:43 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
_Алиса_ Насколько я поняла в С# нельзя динамически добавлять свойства. Остается только создавать класс с помощью рефлексии или еще какой-нибудь путь есть? Подскажите в каком направлении почитать? Ну как так нельзя динамически? Легко ! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 14:29 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
авторНу тогда что-то типа public class PersonByDepartment { int key {get; set;} string name {get; set;} IEnumerable<Department> departments {get;set;} ...... } И каким-то демоническим способом замапить список к столбцам. Надеюсь, список подразделений ограничен и не меняется? Я тоже об этом думала. Но не могу отобразить такой класс в GridControl. Пробовала сделать биндинг, все равно данные не показываются. Список подразделений это справочник, и ес-но он разный, в зависимости на какую дату формируется выборка, кто ее формирует и других условий. Ведь на каждый год справочник отличается и у пользователей уровни доступа разные. Где-то в инете была статья как из массива типа object[,] полноценный DataSource для грида сделать. Может такой год для List переделать... автор_Алиса_, начнем с того, что мне не кажется что Ваша структура классов при отношении многие-ко-многим правильна. Возможно с точки зрения нормализации, и не правильна. Но я работаю с частью кода, у меня есть входные данные и выходные. Ради меня не будут всю архитектуру приложения менять. У меня задача представить базовые наборы данных для разных форм в том виде, в котором хочет видеть заказчик. Да и не реально все переписывать, когда заказчик по пять раз на дню решение меняет. авторАлиса_, ищите по словам PivotGridControl... может что и найдете... если нет... гуглить по c# pivot list of objects Спасибо, изучу вопрос. авторНу как так нельзя динамически? Легко! Хм, вопрос, как это все привязать для отображения в GridControl) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 08:24 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
Как вариант - к гриду биндить не IEnumerable<T>, а DataTable - у нее структура колонок вполне себе формируется на рантайме, и по этой структуре на рантайме же грид может сам создать нужные столбцы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 08:47 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
авторКак вариант - к гриду биндить не IEnumerable<T>, а DataTable - у нее структура колонок вполне себе формируется на рантайме, и по этой структуре на рантайме же грид может сам создать нужные столбцы. Совершенно с вами согласна, DataTable решает вопрос, только мне использовать этот класс крайне не рекомендовано. Дело в том, что вся иерархия классов в приложении своя собственная начиная от базовых. Используя DataTable я нарушаю логику и архитектуру приложения, что не есть гуд( ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 09:58 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
_Алиса_авторКак вариант - к гриду биндить не IEnumerable<T>, а DataTable - у нее структура колонок вполне себе формируется на рантайме, и по этой структуре на рантайме же грид может сам создать нужные столбцы. Совершенно с вами согласна, DataTable решает вопрос, только мне использовать этот класс крайне не рекомендовано. Дело в том, что вся иерархия классов в приложении своя собственная начиная от базовых. Используя DataTable я нарушаю логику и архитектуру приложения, что не есть гуд( В данном случае речь идет не об архитектуре приложения, а о способе отображения. Разделите логику отображения и модельную логику; в класс, отвечающий за отображение/взаимодействие с UI (контроллер) передавайте ваши IEnumerable<T>, внутри конвертируйте их в DataTable, и отображайте. Если потребуется, можно сделать и обратную конвертацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 10:35 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
авторВ данном случае речь идет не об архитектуре приложения, а о способе отображения. Разделите логику отображения и модельную логику; в класс, отвечающий за отображение/взаимодействие с UI (контроллер) передавайте ваши IEnumerable<T>, внутри конвертируйте их в DataTable, и отображайте. Если потребуется, можно сделать и обратную конвертацию. Хороший рабочий вариант. Мне в этом способе смущает одно, производительность при конвертации данных в DataTable и обратно, хотя наверное сомнения не обоснованны. Все же интересно, DataTable поля содержит в коллекциях, и проблем с отображением их в гриде нет. Может существует просто способ класс типа: Код: c# 1. 2. 3. 4.
Привязать на к датагриду? Интервейс там реализовать или атрибут присвоить? Вроде бы простая вещь... Даже не думала, что сложности возникнут( ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 10:54 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
_Алиса_Может существует просто способ класс типа: Код: c# 1. 2. 3. 4.
Привязать на к датагриду? Это стандартный для DataGridView способ ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 13:44 |
|
Отобразить строки в столбцах
|
|||
---|---|---|---|
#18+
_Алиса_Может существует просто способ класс типа: Код: c# 1. 2. 3. 4.
Привязать на к датагриду? Интервейс там реализовать или атрибут присвоить? Вроде бы простая вещь... Даже не думала, что сложности возникнут( Нет, не существует. DataTable может служить источником динамически формируемых столбцов для грида за счет того, что, реализуя интерфейс IListSource, в методе GetList этого интерфейса возвращает экземпляр DataView, который, в свою очередь, реализует интерфейсы IList и ITypedList - последний интерфейс и предоставляет информацию в виде PropertyDescriptorCollection для формирования столбцов (методом GetItemProperties), а доступ к данным на чтение/изменение осуществляется через экземпляры реализации PropertyDescriptor, содержащихся в PropertyDescriptorCollection. Хотите это всё реализовать сами - пожалуйста, но будет много писанины, и возни с PropertyDescriptor и PropertyDescriptorCollection (гриды для IEnumerable<T>, где у T фиксированная структура свойств, умеют извлекать всю нужную информацию сами). Вот, например, чисто наколеночный набросок того, что вы хотите: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97.
- лично мне было бы лень всё это кодить при наличии готового решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 15:46 |
|
|
start [/forum/topic.php?fid=20&msg=39163794&tid=1400818]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 290ms |
total: | 446ms |
0 / 0 |