将动态创建的属性绑定到网格

时间:2011-06-21 03:06:56

标签: c#-4.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);

在添加这样的几个人对象后,我使用绑定源将其绑定到数据网格视图。但是在绑定到网格视图后,我的动态创建的属性不会显示在网格中。

2 个答案:

答案 0 :(得分:2)

当我有一个需要绑定到网格的通用对象列表时,我喜欢使用Linq select语句。

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

然后,您可以使用您定义的属性名来访问列。

答案 1 :(得分:1)

我敢打赌你的网格不支持动态类型。如果您绝对必须使用动态类型,则可能必须使用反射手动将列添加到网格中,或者自己指定它们。我的建议是重构你的代码以摆脱动态类型。在我看来,使用动态类型通常是一种代码气味(并不是说它们没有合法的用途,但我看到你做的事情也可以用匿名类型而不是动态来完成。)