2009-05-08 39 views
1

RowをGridviewにバインドしようとしていますが、カテゴリテーブルのフィールドだけでなく他のテーブルも含めます。だから私はすべてのフィールドにプロパティを設定しました。しかし、テーブルの列が頻繁に変更される可能性があるため、プロパティも動的に変更する必要があります。私はハッシュテーブルを使ってそれを行う次の1つの方法を見つけました。しかし、私はグリッドビューにハッシュテーブルの値をバインドすることはできません。Cで動的プロパティを作成し、ハッシュテーブルをバインドする

この問題を解決するにはどうすればよいですか?

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

答えて

1

Hashtable.ValuesICollectionである - しかし、あなたは、データをバインドするIListを必要としています。理想的にはタイプのリストが必要です。なぜHashtableをここで使うのですか?私はあなたがそれを必要とする十分な行を持っているとは思わない...

代わりに、入力リスト(List<T>またはBindingList<T>)を使用してください。グリッド内の単一のタイプにのみバインドできることに注意してください。あなたが現時点であなただけの記述を追加しているので、グリッドに表示したいものを私には全く明らかではないが、最も単純なレベルで:

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

または(より良い):

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

これにより、1つのグリッドにProductsCategoriesの両方を入れて助けにはなりません...しかし、その後、は、彼らが同じ型でないんだろう場合。 かもしれない仕事は一般的なプロパティの匿名型であることを一つのこと:

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(); 

ただし、匿名型は不変(編集不可能)されていないこと - ToBindingList()を使用して、したがって何のポイントは。もう1つの選択肢は、目的のために独自のクラスを宣言することです。つまり、編集も可能です。

関連する問題