Domanda

Ho una griglia DevExpress (DevExpress.XtraGrid.GridControl 8.2) con un'origine dati impostata in fase di runtime in questo modo:

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

Ciò significa che la vista non ha idea di come appariranno i dati in fase di progettazione.Mi piace poter impostare una query LINQ come origine dati, ma vorrei anche specificare come apparirà la vista in fase di progettazione.

  • C'è un modo per dire alla vista che utilizzerà questa query?
  • La soluzione migliore sarebbe quella di creare un piccolo oggetto per mantenere il contenuto di ciò che viene restituito da questa query?
È stato utile?

Soluzione

Si dovrà definire una classe per il tipo di ritorno della query LINQ se si desidera che la griglia DevExpress per raccogliere automaticamente le colonne per l'origine dati. In fase di progettazione, il motore di associazione WinForm sta usando riflessione o ICustomTypeDescriptor se la fonte lo implementa di rilevare automaticamente le proprietà, i loro tipi, ecc della sorgente dati. La griglia DevExpress utilizza questo meccanismo vincolante sottostante e generare automaticamente le colonne per te in fase di progettazione sulla base delle informazioni di proprietà. Nel tuo caso però, si sta creando un tipo anonimo nella query LINQ che non è noto o disponibili in fase di progettazione. Pertanto, DevExress griglia non è in grado di generare automaticamente le colonne. Come accennato @Dennis, è possibile aggiungere manualmente le colonne alla griglia in designer. È necessario fare in modo che 'FieldName', credo, sulla colonna corrisponde al nome proprietà sulla vostra fonte di dati.

Se si va con una classe, si consiglia inoltre di implementare INotifyPropertyChanged per rendere la griglia a conoscenza di modifiche dei dati nell'origine dati.

Altri suggerimenti

IIRC, il xtragrid richiede che l'origine dati implementano un'interfaccia databinding (cioè IBindingList (T)) per poter generare automaticamente colonne e gli articoli dovrebbe attuare INotifyPropertyChanged.

Con questo in mente: se si fa creare colonne tramite la procedura guidata in fase di progettazione o nel codice in fase di esecuzione, fino a quando si imposta la proprietà FieldName delle colonne, mostreranno i dati dall'origine dati con una proprietà di quel nome.

Note:

  • Penso che debba essere una proprietà, auto o no, come ho scoperto che a volte non si legherà variabili pubbliche.
  • La proprietà deve essere assegnata qualcosa (di default o in altro modo).
  • Ci deve essere un costruttore senza parametri per la voce.

I campi sono noti in fase di progettazione (Campo1, Campo2, Campo3).

Secondo DevExpress Puoi usare IList, IListSource, ITypedList O IBindingList.La differenza tra loro è se è possibile aggiungere nuove righe o se le modifiche stanno perfezionando il controllo.

Quindi puoi usare 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:L'ho testato utilizzando DevExpress 10.1, ma se utilizza il file Associazione WinForms allora dovrebbe continuare a funzionare secondo MSDN.

Non ho lavorato con la rete DevExpress, ma ho fatto molto con la DataGridView NET.

La griglia DevExpress hanno la stessa funzionalità DataGridView NET che genera automaticamente le colonne?

Se è così, allora dovrebbe visualizzare qualsiasi campi si trovano nella vostra interrogazione e utilizzerà Field1, Campo2 e Field3 (dal codice esempio) come nomi di colonna.

O semplicemente disattivare la funzione di generare automaticamente colonna e aggiungere le colonne in fase di progettazione. Fintanto che corrispondono alla tua query restituisce dovrebbe funzionare bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top