powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отобразить строки в столбцах
17 сообщений из 17, страница 1 из 1
Отобразить строки в столбцах
    #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
Отобразить строки в столбцах
    #39163794
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Отобразить строки в столбцах
    #39163846
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Алиса_, а можно поинтересоваться почему нельзя отделы, к которым приписана персона, отображать списком через запятую в одной колонке? Это бы упростило Вашу задачу напорядок.
...
Рейтинг: 0 / 0
Отобразить строки в столбцах
    #39163868
_Алиса_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потому-что заказчик желает видеть в таком разрезе "и точка") Просто принято у них такая форма и все тут.
...
Рейтинг: 0 / 0
Отобразить строки в столбцах
    #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
Отобразить строки в столбцах
    #39163871
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Алиса_, начнем с того, что мне не кажется что Ваша структура классов при отношении многие-ко-многим правильна.
...
Рейтинг: 0 / 0
Отобразить строки в столбцах
    #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
Отобразить строки в столбцах
    #39163889
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Алиса_, ищите по словам Pivot GridControl... может что и найдете...
если нет... гуглить по c# pivot list of objects
...
Рейтинг: 0 / 0
Отобразить строки в столбцах
    #39163979
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Алиса_ Насколько я поняла в С# нельзя динамически добавлять свойства. Остается только создавать класс с помощью рефлексии или еще какой-нибудь путь есть? Подскажите в каком направлении почитать?
Ну как так нельзя динамически?
Легко !
...
Рейтинг: 0 / 0
Отобразить строки в столбцах
    #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
Отобразить строки в столбцах
    #39164682
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант - к гриду биндить не IEnumerable<T>, а DataTable - у нее структура колонок вполне себе формируется на рантайме, и по этой структуре на рантайме же грид может сам создать нужные столбцы.
...
Рейтинг: 0 / 0
Отобразить строки в столбцах
    #39164689
_Алиса_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторКак вариант - к гриду биндить не IEnumerable<T>, а DataTable - у нее структура колонок вполне себе формируется на рантайме, и по этой структуре на рантайме же грид может сам создать нужные столбцы.

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

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


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


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



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

Это стандартный для DataGridView способ
...
Рейтинг: 0 / 0
Отобразить строки в столбцах
    #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
Отобразить строки в столбцах
    #39164805
_Алиса_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Сон Веры Павловны

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


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