Вопрос

У меня есть DevExpress grid (DevExpress.xtrag grid.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 в качестве источника данных, но я бы также хотел указать, как будет выглядеть представление во время разработки.

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

Решение

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

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

Другие советы

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

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

Примечания:

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

Поля известны во время разработки (Field1, Field2, Field3).

Согласно 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.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top