2009-05-19 3 views
0

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

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

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

ответ

2

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

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

0

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

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

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

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

1

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

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

Примечание:

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

Поля известны во время разработки (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 binding, то он должен еще работать в соответствии с MSDN.

Смежные вопросы