Источник данных LINQ и Devexpress Grid - PullRequest
0 голосов
/ 20 мая 2009

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

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

Ответы [ 4 ]

2 голосов
/ 20 мая 2009

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

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

1 голос
/ 26 октября 2011

Поля известны во время разработки (Поле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 .

1 голос
/ 20 мая 2009

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

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

Примечания:

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

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

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

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

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

...