Привязать динамически созданные свойства к сетке - PullRequest
0 голосов
/ 21 июня 2011

Мой класс подобен этому,

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 ]

2 голосов
/ 21 июня 2011

Когда у меня есть список универсальных объектов, которые необходимо привязать к сетке, мне нравится использовать оператор выбора Linq.

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

Затем вы можете использовать имена свойств, которые вы определили, для доступа к столбцам.

1 голос
/ 21 июня 2011

Держу пари, что ваша сетка не поддерживает динамические типы. Если вам абсолютно необходимо использовать динамический тип для этого, вам, вероятно, придется использовать отражение, чтобы вручную добавить столбцы в сетку, или просто укажите их самостоятельно. Мое предложение было бы реорганизовать ваш код, чтобы избавиться от динамического типа. По моему мнению, использование динамических типов обычно является запахом кода (не то, что для них нет законного использования, но то, что я вижу, вы можете делать с анонимными типами вместо динамических).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...