Источник данных LINQ и Devexpress Grid

У меня есть сетка DevExpress (DevExpress.XtraGrid.GridControl 8.2) с источником данных, установленным во время выполнения, например:

private DataContext db = new DataContext("connection string");
gridControl.DataSource = from t in db.sometable
                          select new
                          {
                              Field1 = t.Name,
                              Field2 = t.Email,
                              Field3 = t.City
                          };

Это означает, что представление не знает, как будут выглядеть данные во время разработки. Мне нравится иметь возможность установить запрос LINQ в качестве источника данных, но я также хотел бы указать, как будет выглядеть представление во время разработки.

  • Есть ли способ сообщить представлению, что оно будет использовать этот запрос?
  • Было бы лучшим решением создать небольшой объект для хранения содержимого того, что возвращается из этого запроса?

person Jason Marcell    schedule 19.05.2009    source источник


Ответы (4)


Вам нужно будет определить класс для возвращаемого типа вашего запроса LINQ, если вы хотите, чтобы сетка DevExpress автоматически выбирала столбцы для источника данных. Во время разработки механизм привязки WinForm использует отражение или ICustomTypeDescriptor, если источник реализует его, для автоматического обнаружения свойств, их типов и т. д. источника данных. Сетка DevExpress использует этот базовый механизм привязки и автоматически создает столбцы во время разработки на основе информации о свойствах. Однако в вашем случае вы создаете анонимный тип в своем запросе LINQ, который неизвестен или недоступен во время разработки. Поэтому DevExress Grid не может автоматически создавать столбцы. Как упоминал @Dennis, вы можете вручную добавлять столбцы в сетку в конструкторе. Вы должны убедиться, что «FieldName», я полагаю, в столбце соответствует имени свойства в вашем источнике данных.

Если вы используете класс, вы также можете реализовать INotifyPropertyChanged, чтобы сетка знала об изменениях данных в источнике данных.

person Mehmet Aras    schedule 20.05.2009

IIRC, xtragrid требует, чтобы источник данных реализовал интерфейс привязки данных (т. е. IBindingList (T)) для автоматического создания столбцов, а элементы должны реализовывать INotifyPropertyChanged.

Имейте это в виду: если вы создаете столбцы с помощью мастера во время разработки или в коде во время выполнения, пока вы устанавливаете свойство FieldName столбцов, они будут отображать данные из источника данных со свойством с этим именем.

Примечания:

  • Я думаю, что это должно быть свойство, автоматическое или нет, поскольку я обнаружил, что иногда оно не будет связываться с общедоступными переменными.
  • Свойству должно быть что-то назначено (по умолчанию или иначе).
  • Для элемента должен быть конструктор без параметров.
person Steven Evers    schedule 20.05.2009

Поля известны во время разработки (Поле1, Поле2, Поле3).

В соответствии с DevExpress вы можете использовать IList, IListSource, ITypedList или IBindingList. Разница между ними заключается в том, можете ли вы добавлять новые строки или изменения вносятся в элемент управления.

Итак, вы можете использовать ToList():

private DataContext db = new DataContext("connection string");
gridControl.DataSource = (from t in db.sometable
                         select new
                         {
                             Field1 = t.Name,
                             Field2 = t.Email,
                             Field3 = t.City
                         }).ToList();

Примечание. Я протестировал его с помощью DevExpress 10.1, но если он использует привязка WinForms, то она все равно должна работать в соответствии с MSDN.

person user868538    schedule 26.10.2011

Я не работал с сеткой DevExpress, но много сделал с .NET DataGridView.

Имеет ли сетка DevExpress ту же функциональность, что и .NET DataGridView, которая автоматически создает столбцы?

Если это так, то он должен отображать все поля, найденные в вашем запросе, и будет использовать Field1, Field2 и Field3 (из вашего примера кода) в качестве имен столбцов.

Или просто отключите функцию автоматического создания столбцов и добавьте столбцы во время разработки. Пока они соответствуют тому, что возвращает ваш запрос, он должен работать нормально.

person CoderDennis    schedule 19.05.2009