Pergunta

Eu tenho uma grade DevExpress (DevExpress.XtraGrid.GridControl 8,2) com um conjunto de fonte de dados em tempo de execução assim:

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 vista 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 em tempo de design.

  • Existe uma maneira que eu posso dizer a visão de que ele vai estar usando essa consulta?
  • Será que a melhor solução é criar um pequeno objeto para a realização da conteúdo do que é retornado a partir de esta consulta?
Foi útil?

Solução

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 os implementos fonte, 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, na coluna corresponde ao nome da propriedade no seu fonte de dados.

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

Outras dicas

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 desse 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.

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

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

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 usa o WinForms ligação então ele deve ainda trabalho de acordo com MSDN .

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 .NET DataGridView 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 seus consulta retorna ele deve funcionar bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top