2011-06-21 7 views
0

私のクラスでは、このようなものです、バインドは動的に

public class Person : DynamicObject 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
    Dictionary<string, object> dictionary = new Dictionary<string, object>(); 
    public int Count 
    { 
     get 
     { 
      return dictionary.Count; 
     } 
    } 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     string name = binder.Name; 
     return dictionary.TryGetValue(name, out result); 
    } 
    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     dictionary[binder.Name] = value; 
     return true; 
    } 
    public void AddProperty<TTValue>(string key, TTValue value = default(TTValue)) 
    { 
     dictionary[key] = value; 
    } 
    public void AddProperty(string typeName, string key, object value = null) 
    { 
     Type type = Type.GetType(typeName); 
     dictionary[key] = Convert.ChangeType(value, type); 
    } 
} 

は、その後、私は、このクラスからオブジェクトを作成していますし、数人のオブジェクトを追加した後、リスト

dynamic p = new Person(); 
p.Name = "john"; 
p.Address = "address1"; 
p.AddProperty<DateTime>("BirthDate", DateTime.Now); 
p.AddProperty("System.String", "Weigth", "70 kg"); 

List<Person> lstPerson=new List<Person>(); 

lstPerson.Add(p); 

に追加グリッドにプロパティを作成しますこのように私はこれをバインディングソースを使ってDataGridビューにバインドします。しかし、グリッドビューにバインドされた後、動的に作成されたプロパティはグリッドに表示されません。

答えて

2

グリッドにバインドする必要がある汎用オブジェクトのリストがある場合、Linq select文を使用したいと思います。

var dataSource = myList.Select(item=> new 
       { Name = item.Key, 
       MainAddress = item.Address.First() }); 
grid.DataSource = dataSource; 
grid.DataBind(); 

次に、定義したプロパティ名を使用して列にアクセスできます。

1

あなたのグリッドはダイナミックタイプをサポートしていない可能性があります。このために動的なタイプを絶対に使用する必要がある場合は、リフレクションを使用してグリッドに列を手動で追加するか、または自分で指定する必要があります。私の提案は、あなたのコードをリファクタリングして動的な型を取り除くことです。私の意見では、動的な型の使用は、通常、コードの匂いです(正当な使用方法ではありませんが、動的ではなく匿名の型で行うことができます)。

関連する問題