Question

I ai une grille DevExpress (DevExpress.XtraGrid.GridControl 8,2) avec une source de données mis à l'exécution de cette façon:

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

Cela signifie que le point de vue n'a aucune idée de ce que les données va ressembler au moment de la conception. J'aime être en mesure de définir une requête LINQ comme source de données, mais je voudrais aussi vous préciser ce que la vue ressemblera au moment de la conception.

  • Est-il possible que je puisse dire à la vue qu'il utilisera cette requête?
  • la meilleure solution serait de créer un petit objet pour maintenir la le contenu de ce qui est renvoyée de cette requête?
Était-ce utile?

La solution

Vous devrez définir une classe pour le type de retour de votre requête LINQ si vous voulez la grille DevExpress pour ramasser automatiquement les colonnes de la source de données. Au moment de la conception, le moteur de liaison WinForm utilise la réflexion ou ICustomTypeDescriptor si la source met en œuvre pour découvrir automatiquement les propriétés, leurs types, etc de la source de données. La grille DevExpress utilise ce mécanisme de liaison sous-jacente et de générer automatiquement les colonnes pour vous au moment de la conception basée sur les informations de propriété. Dans votre cas, cependant, vous créez un type anonyme dans votre requête LINQ qui est inconnu ou disponible au moment de la conception. Par conséquent, la grille DevExress ne peut pas générer les colonnes automatiquement. Comme @Dennis mentionné, vous pouvez ajouter manuellement des colonnes à la grille dans le concepteur. Vous devez vous assurer que « FieldName », je crois, sur la colonne correspond au nom de la propriété sur votre source de données.

Si vous allez avec une classe, vous pouvez également mettre en œuvre INotifyPropertyChanged pour rendre la grille au courant des changements de données dans la source de données.

Autres conseils

IIRC, le xtragrid exige que la source de données mise en œuvre d'une interface de liaison de données (c.-à-IBindingList (T)) pour des colonnes à générer automatiquement et les éléments devraient mettre en œuvre INotifyPropertyChanged.

Avec cela à l'esprit: si vous créez des colonnes via l'assistant au moment de la conception ou dans le code lors de l'exécution, tant que vous définissez la propriété FieldName des colonnes, ils montreront les données de la source de données avec une propriété de cette nom.

Notes:

  • Je pense que ce doit être une propriété, auto ou non, comme je l'ai constaté que parfois ne se lie pas à des variables publiques.
  • La propriété doit être attribué quelque chose (par défaut ou autre).
  • Il doit y avoir un constructeur sans paramètre pour l'élément.

Les champs sont connus au moment de la conception (Field1, Field2, Field3).

Selon DevExpress vous pouvez utiliser IList, IListSource, ITypedList ou IBindingList. La différence entre eux est de savoir si vous pouvez ajouter de nouvelles lignes ou si des changements sont REFIN le contrôle.

Vous pouvez donc utiliser 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();

Remarque : Je l'ai testé à l'aide DevExpress 10.1, mais si elle ne l'utilise WinForms contraignant alors il devrait encore fonctionner selon MSDN .

Je n'ai pas travaillé avec la grille DevExpress, mais je l'ai fait beaucoup avec le .NET DataGridView.

La grille DevExpress ont les mêmes fonctionnalités que le DataGridView .NET qui génère automatiquement des colonnes?

Si oui, alors il devrait afficher tout les champs se trouvent dans votre requête et utilisera Field1, Field2 et Field3 (à partir de votre code par exemple) que les noms de colonnes.

Ou tout simplement désactiver la fonction de la colonne générer automatiquement et ajouter les colonnes au moment de la conception. Tant qu'ils correspondent à ce que votre requête retourne il devrait fonctionner correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top