Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отобразить строки в столбцах / 17 сообщений из 17, страница 1 из 1
05.02.2016, 12:28
    #39163767
_Алиса_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
Доброго здоровья уважаемые посетители форума! Недавно я встала на пусть познания 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. Насколько я поняла в С# нельзя динамически добавлять свойства. Остается только создавать класс с помощью рефлексии или еще какой-нибудь путь есть? Подскажите в каком направлении почитать?
...
Рейтинг: 0 / 0
05.02.2016, 12:49
    #39163794
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
...
Рейтинг: 0 / 0
05.02.2016, 13:21
    #39163846
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
_Алиса_, а можно поинтересоваться почему нельзя отделы, к которым приписана персона, отображать списком через запятую в одной колонке? Это бы упростило Вашу задачу напорядок.
...
Рейтинг: 0 / 0
05.02.2016, 13:32
    #39163868
_Алиса_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
Потому-что заказчик желает видеть в таком разрезе "и точка") Просто принято у них такая форма и все тут.
...
Рейтинг: 0 / 0
05.02.2016, 13:33
    #39163869
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
_Алиса_Потому-что заказчик желает видеть в таком разрезе "и точка") Просто принято у них такая форма и все тут.

Ну тогда что-то типа
Код: c#
1.
2.
3.
4.
5.
6.
7.
public class PersonByDepartment
{
int key {get; set;} 
string name {get; set;}
IEnumerable<Department> departments {get;set;}
......
}



И каким-то демоническим способом замапить список к столбцам. Надеюсь, список подразделений ограничен и не меняется?
...
Рейтинг: 0 / 0
05.02.2016, 13:34
    #39163871
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
_Алиса_, начнем с того, что мне не кажется что Ваша структура классов при отношении многие-ко-многим правильна.
...
Рейтинг: 0 / 0
05.02.2016, 13:36
    #39163873
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
PallarisНу тогда что-то типа
Код: c#
1.
2.
3.
4.
5.
6.
7.
public class PersonByDepartment
{
int key {get; set;} 
string name {get; set;}
IEnumerable<Department> departments {get;set;}
......
}


Тут сперва надо понять что есть поле name в данном классе, при том что класс Person уже существует. И видимо забыто, что отношение many-to-many.
...
Рейтинг: 0 / 0
05.02.2016, 13:43
    #39163889
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
_Алиса_, ищите по словам Pivot GridControl... может что и найдете...
если нет... гуглить по c# pivot list of objects
...
Рейтинг: 0 / 0
05.02.2016, 14:29
    #39163979
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
_Алиса_ Насколько я поняла в С# нельзя динамически добавлять свойства. Остается только создавать класс с помощью рефлексии или еще какой-нибудь путь есть? Подскажите в каком направлении почитать?
Ну как так нельзя динамически?
Легко !
...
Рейтинг: 0 / 0
06.02.2016, 08:24
    #39164675
_Алиса_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
авторНу тогда что-то типа
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)
...
Рейтинг: 0 / 0
06.02.2016, 08:47
    #39164682
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
Как вариант - к гриду биндить не IEnumerable<T>, а DataTable - у нее структура колонок вполне себе формируется на рантайме, и по этой структуре на рантайме же грид может сам создать нужные столбцы.
...
Рейтинг: 0 / 0
06.02.2016, 09:58
    #39164689
_Алиса_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
авторКак вариант - к гриду биндить не IEnumerable<T>, а DataTable - у нее структура колонок вполне себе формируется на рантайме, и по этой структуре на рантайме же грид может сам создать нужные столбцы.

Совершенно с вами согласна, DataTable решает вопрос, только мне использовать этот класс крайне не рекомендовано. Дело в том, что вся иерархия классов в приложении своя собственная начиная от базовых. Используя DataTable я нарушаю логику и архитектуру приложения, что не есть гуд(
...
Рейтинг: 0 / 0
06.02.2016, 10:35
    #39164695
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
_Алиса_авторКак вариант - к гриду биндить не IEnumerable<T>, а DataTable - у нее структура колонок вполне себе формируется на рантайме, и по этой структуре на рантайме же грид может сам создать нужные столбцы.

Совершенно с вами согласна, DataTable решает вопрос, только мне использовать этот класс крайне не рекомендовано. Дело в том, что вся иерархия классов в приложении своя собственная начиная от базовых. Используя DataTable я нарушаю логику и архитектуру приложения, что не есть гуд(
В данном случае речь идет не об архитектуре приложения, а о способе отображения. Разделите логику отображения и модельную логику; в класс, отвечающий за отображение/взаимодействие с UI (контроллер) передавайте ваши IEnumerable<T>, внутри конвертируйте их в DataTable, и отображайте. Если потребуется, можно сделать и обратную конвертацию.
...
Рейтинг: 0 / 0
06.02.2016, 10:54
    #39164697
_Алиса_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
авторВ данном случае речь идет не об архитектуре приложения, а о способе отображения. Разделите логику отображения и модельную логику; в класс, отвечающий за отображение/взаимодействие с UI (контроллер) передавайте ваши IEnumerable<T>, внутри конвертируйте их в DataTable, и отображайте. Если потребуется, можно сделать и обратную конвертацию.


Хороший рабочий вариант. Мне в этом способе смущает одно, производительность при конвертации данных в DataTable и обратно, хотя наверное сомнения не обоснованны. Все же интересно, DataTable поля содержит в коллекциях, и проблем с отображением их в гриде нет. Может существует просто способ класс типа:
Код: c#
1.
2.
3.
4.
public class MyTable
{
     public List<MyRow> Fileds{get; set;}
}


Привязать на к датагриду? Интервейс там реализовать или атрибут присвоить? Вроде бы простая вещь... Даже не думала, что сложности возникнут(
...
Рейтинг: 0 / 0
06.02.2016, 13:44
    #39164742
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
_Алиса_Может существует просто способ класс типа:
Код: c#
1.
2.
3.
4.
public class MyTable
{
     public List<MyRow> Fileds{get; set;}
}



Привязать на к датагриду?

Это стандартный для DataGridView способ
...
Рейтинг: 0 / 0
06.02.2016, 15:46
    #39164775
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
_Алиса_Может существует просто способ класс типа:
Код: c#
1.
2.
3.
4.
public class MyTable
{
     public List<MyRow> Fileds{get; set;}
}


Привязать на к датагриду? Интервейс там реализовать или атрибут присвоить? Вроде бы простая вещь... Даже не думала, что сложности возникнут(
Нет, не существует. 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.
public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
    gridControl1.DataSource = new FooList
    {
      new Foo {Id = 1, Name = "Foo", Flags = new[] {true, true, true}},
      new Foo {Id = 2, Name = "Bar", Flags = new[] {true, false, true}},
      new Foo {Id = 3, Name = "Zot", Flags = new[] {false, true, false}}
    };
  }
}

public class Foo
{
  public int Id { get; set; }
  public string Name { get; set; }
  public bool[] Flags { get; set; }
}

public class FooList : List<Foo>, ITypedList
{
  public string GetListName(PropertyDescriptor[] listAccessors)
  {
    return GetType().FullName;
  }

  public static readonly string[] Names = new[] { "Id", "Name", "A", "B", "C" };
  public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)
  {
    return new PropertyDescriptorCollection(Names.Select(s => new FooPropertyDescriptor(s, null)).ToArray());
  }
}

public class FooPropertyDescriptor : PropertyDescriptor
{
  public FooPropertyDescriptor(string name, Attribute[] attrs)
    : base(name, attrs)
  {
  }

  public FooPropertyDescriptor(MemberDescriptor descr)
    : base(descr)
  {
  }

  public FooPropertyDescriptor(MemberDescriptor descr, Attribute[] attrs)
    : base(descr, attrs)
  {
  }

  public override bool CanResetValue(object component)
  {
    return false;
  }

  public override object GetValue(object component)
  {
    var pi = typeof(Foo).GetProperty(Name, BindingFlags.Public | BindingFlags.Instance);
    return pi != null
      ? pi.GetValue(component, null)
      : ((Foo)component).Flags[Array.IndexOf(FooList.Names, Name) - 2];
  }

  public override void ResetValue(object component)
  {
  }

  public override void SetValue(object component, object value)
  {
  }

  public override bool ShouldSerializeValue(object component)
  {
    return false;
  }

  public override Type ComponentType
  {
    get { return typeof(Foo); }
  }

  public override bool IsReadOnly
  {
    get { return true; }
  }

  public override Type PropertyType
  {
    get
    {
      var pi = typeof(Foo).GetProperty(Name, BindingFlags.Public | BindingFlags.Instance);
      return pi == null ? typeof(bool) : pi.DeclaringType;
    }
  }
}


- лично мне было бы лень всё это кодить при наличии готового решения.
...
Рейтинг: 0 / 0
06.02.2016, 17:45
    #39164805
_Алиса_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобразить строки в столбцах
> Сон Веры Павловны

Очень интересно! Вот именно это и хотелось узнать. Спасибо!)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отобразить строки в столбцах / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]