Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Linq to Sql utilise des informations de mapping pour générer les requêtes Sql.
Comment récupérer ces informations de mapping pour notre propre usage ?
Imaginons un scénario simple pour générer dynamiquement les colonnes d'une grille (en mettant des combos pour les relations par exemple).
var db = new NorthwindDataContext();
var q =
from c in db.Customers
select c;
grid.Columns.Add(...);
grid.Columns.Add(...);
...
grid.ItemsSource = q.ToList();
Comments
Anonymous
August 24, 2008
PingBack from http://hoursfunnywallpaper.cn/?p=2892Anonymous
August 25, 2008
On pourrait envisager quelque chose comme ça : foreach (var p in from prop in typeof(Product).GetProperties() where prop.GetCustomAttributes(typeof(ColumnAttribute), true).Any() select prop) dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = p.Name, DataPropertyName = p.Name }); foreach (var p in from prop in typeof(Product).GetProperties() where prop.GetCustomAttributes(typeof(AssociationAttribute), true).Any() select prop) dataGridView1.Columns.Add(new DataGridViewComboBoxColumn { HeaderText = p.Name, DataPropertyName = p.Name, DataSource = db.GetTable(p.PropertyType) }); dataGridView1.DataSource = q;Anonymous
August 25, 2008
var tableMetaType = db.Mapping.GetTable(typeof(Customer)).MetaType; foreach(var columnMetaData in tableMetaType.DataMembers) { if(columnMetaData.IsAssociation) { grid.Columns.Add(BuildEntityRefColumn(columnMetaData.Name, columnMetaData.Association.OtherType); } else { grid.Columns.Add(new ScalarColumn(columnMetaData.MappedName, columnMetaData.Name); } } Un truc dans le genre à priori (pas testé, ni même buildé ^^)Anonymous
August 25, 2008
Mathieu, ton code ne fonctionne qu'avec le mapping par attribut :p OUNED !Anonymous
August 25, 2008
Voici mon idée: je passe par le TypeDescriptor. On ajoute une méthode MapColumn<T>: var q = from c in db.Customers select c; MapColumn(grid,q); grid.ItemsSource = q.ToList();
Et le code de la méthode (au moins la partie intéressante: private void MapColumn<T>(DataGridView gv, IEnumerable<T> result) { PropertyDescriptorCollection propertyCollection = TypeDescriptor.GetProperties(typeof(T)); gv.Columns.Clear(); foreach (PropertyDescriptor prop in propertyCollection) { if (prop.PropertyType == typeof(bool)) { // A remplir... } else if (prop.PropertyType == typeof(DateTime)) { // A remplir... } else { // A remplir... } } }
- Anonymous
August 25, 2008
The comment has been removed - Anonymous
August 25, 2008
Petite coquille, remplacez 'MetaType' par 'RowType' dans l'exemple de Simon