LINQ e DevExpress Grade Datasource

votos
0

Eu tenho uma grade DevExpress (DevExpress.XtraGrid.GridControl 8.2) com uma fonte de dados definida em tempo de execução da seguinte forma:

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
                          };

Isto significa que a visão não tem idéia do que os dados estão indo olhar como em tempo de design. Eu gosto de ser capaz de definir uma consulta LINQ como a fonte de dados, mas eu também gostaria de especificar que a exibição será semelhante no momento da concepção.

  • Existe uma maneira que eu posso dizer a visão de que ele vai estar usando esta consulta?
  • Seria a melhor solução é criar um pequeno objeto para segurar o conteúdo do que é retornado a partir desta consulta?
Publicado 19/05/2009 em 22:35
fonte usuário
Em outras línguas...                            


4 respostas

votos
2

Você terá que definir uma classe para o tipo de retorno de sua consulta LINQ se você deseja que a grade DevExpress para automaticamente pegar as colunas da fonte de dados. Em tempo de design, o mecanismo de ligação WinForm está usando reflexão ou ICustomTypeDescriptor se a fonte implementa-lo para descobrir automaticamente as propriedades, seus tipos, etc da fonte de dados. A grade de DevExpress está usando este mecanismo de ligação subjacente e gerar automaticamente as colunas para você em tempo de design com base nas informações de propriedade. No seu caso, no entanto, você está criando um tipo anônimo em sua consulta LINQ que não é conhecido ou disponível em tempo de design. Portanto, DevExress grade não pode gerar as colunas automaticamente. Como @ Dennis mencionado, você pode adicionar manualmente colunas para a grade no designer. Você precisa ter certeza de que 'FieldName', creio eu,

Se você vai com uma classe, você também pode querer implementar INotifyPropertyChanged para fazer a grade ciente de alterações de dados na fonte de dados.

Respondeu 20/05/2009 em 20:00
fonte usuário

votos
1

Os campos são conhecidos em tempo de design (Field1, Field2, Field3).

De acordo com DevExpress você pode usar IList, IListSource, ITypedListou IBindingList. A diferença entre eles é se você pode adicionar novas linhas ou se as mudanças são Refin de controle.

Assim você pode usar 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();

Nota : Eu testei usando DevExpress 10.1, mas se ele não usar os WinForms ligação então ele ainda deve funcionar de acordo com MSDN .

Respondeu 26/10/2011 em 07:23
fonte usuário

votos
1

IIRC, o XtraGrid exige que a fonte de dados implementar uma interface de ligação de dados (ou seja, IBindingList (T)) para que possa gerar automaticamente colunas e os itens devem implementar INotifyPropertyChanged.

Com isso em mente: se você criar colunas por meio do assistente em tempo de design ou em código em tempo de execução, desde que você definir a propriedade FieldName das colunas, eles vão mostrar os dados da fonte de dados com uma propriedade com esse nome.

Notas:

  • Eu acho que deve ser uma propriedade, auto ou não, como eu descobri que às vezes não se ligará a variáveis ​​públicas.
  • A propriedade deve ser atribuída alguma coisa (padrão ou de outra forma).
  • Deve haver um construtor sem parâmetros para o item.
Respondeu 20/05/2009 em 19:10
fonte usuário

votos
0

Eu não tenho trabalhado com a grade DevExpress, mas eu fiz um monte com o .NET DataGridView.

A grade de DevExpress tem a mesma funcionalidade que o DataGridView NET que auto gera colunas?

Se sim, então ele deve exibir o que quer que campos são encontrados em sua consulta e vai usar Field1, Field2 e Field3 (do seu código exemplo) como nomes de coluna.

Ou simplesmente desligar o auto gerar recurso coluna e adicione as colunas em tempo de design. Enquanto eles correspondem ao que a sua consulta retorna ele deve funcionar bem.

Respondeu 19/05/2009 em 22:43
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more