2009-05-08 4 views
1

J'essaie de lier Row à gridview qui ne contiendra pas seulement les champs de la table Catégorie mais aussi d'autres tables. J'ai donc des propriétés définies pour tous ces champs. Mais comme les colonnes de la table peuvent changer fréquemment, j'ai également besoin de changer dynamiquement les propriétés. J'ai trouvé la façon suivante de le faire (en utilisant la hashtable). Mais je ne peux pas lier les valeurs de hashtable à gridview.Créer des propriétés dynamiques et lier hashtable dans C#

Comment faire pour résoudre ce problème mieux?

public partial class Form1 : Form 
{ 
    public class Row 
    { 
     // properties 
     public Hashtable Properties = new Hashtable(); 


    } 
    public Form1() 
    { 
     InitializeComponent(); 
     DataClasses1DataContext context = new DataClasses1DataContext(); 
     var st = from c in context.Categories 
       select c; 
     var p = from pr in context.Products 
       select p; 

     Row r = new Row(); 
     //List<Row> listrow = new List<Row>(); 
     foreach (var item in st) 
     { 
      r.Properties.Add(item.Description, item.Description); 
     } 

     this.gridControl1.DataSource = r.Properties.Values; 
    } 
} 

Répondre

1

Hashtable.Values est un ICollection - mais vous devez IList pour lier les données. Idéalement, vous voulez vraiment une liste tapée. Pourquoi utiliser Hashtable du tout ici? Je doute que vous ayez suffisamment de lignes pour en avoir besoin ...

Utilisez plutôt une liste typée (List<T> ou BindingList<T>). Notez que vous ne pouvez lier qu'un seul type dans une grille. Il est pas du tout clair pour moi ce que vous voulez afficher dans la grille, car au moment où vous ajoutez seulement la description, mais au niveau le plus simple:

this.gridControl1.DataSource = context.Categories.ToList(); 

ou (mieux):

this.gridControl1.DataSource = context.Categories.ToBindingList(); 

Cela ne vous aider à mettre à la fois Products et Categories dans une grille unique ... mais, rien sera si elles ne sont pas du même type. Une chose qui pourrait travail est un type anonyme des propriétés communes:

var query = (from c in context.Categories 
      select new {Id = c.CategoryId, Name = c.Category, 
        Description = c.Description }).Concat(
      from p in context.Products 
      select new {Id = p.ProductId, Name = p.Product, 
        Description = p.ProductDescription }); 

this.gridControl1.DataSource = query.ToList(); 

Notez, cependant, que les types anonymes sont immuables (non modifiable) - donc pas de point à l'aide ToBindingList(). L'autre option consiste à déclarer votre propre classe à cette fin, ce qui signifie qu'elle peut également être modifiée.

Questions connexes