Привязка GridView к объекту Dynamic или ExpandoObject - PullRequest
17 голосов
/ 07 апреля 2011

Я использую Массивный ORM Роба Конери, и мне не удалось связать полученный ExpandoObject с GridView.

Я нашел другой вопрос Stackoverflow, который предлагает использовать платформу под названиемэкспромтом, но я не уверен, что это сработает для этого.Если вы знаете, что это так, предоставьте пример кода, чтобы фактически преобразовать ExpandoObject во что-то, с чем может связываться элемент управления GridView.

В худшем случае, кто-нибудь реализовал дополнительный метод (который может бытьподелился) для Massive, чтобы преобразовать полученный ExpandoObject в POCO?

любая помощь с благодарностью.Спасибо.

Ответы [ 6 ]

50 голосов
/ 10 июня 2011

Поскольку вы не можете привязать ExpandoObject, вы можете преобразовать данные в DataTable.Этот метод расширения сделает это за вас.Я мог бы представить это для включения в Massive.

/// <summary>
/// Extension method to convert dynamic data to a DataTable. Useful for databinding.
/// </summary>
/// <param name="items"></param>
/// <returns>A DataTable with the copied dynamic data.</returns>
public static DataTable ToDataTable(this IEnumerable<dynamic> items) {
    var data = items.ToArray();
    if (data.Count() == 0) return null;

    var dt = new DataTable();
    foreach(var key in ((IDictionary<string, object>)data[0]).Keys) {
        dt.Columns.Add(key);
    }
    foreach (var d in data) {
        dt.Rows.Add(((IDictionary<string, object>)d).Values.ToArray());
    }
    return dt;
}
2 голосов
/ 06 июня 2013

Я адаптировал принятый ответ Брайана, чтобы он был немного более кратким и LINQ-y:

public static DataTable ToDataTable(this IEnumerable<dynamic> items)
{
    var list = items.Cast<IDictionary<string, object>>().ToList();
    if(!list.Any()) return null;

    var table = new DataTable();
    list.First().Keys.Each(x => table.Columns.Add(x));
    list.Each(x => x.Values.Each(y => table.Rows.Add(y)));

    return table;
}

(Это предполагает, что вы определили расширение IEnumerable.Each, которое имеет каждая кодовая база, над которой я работалбыло).

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

Если мы говорим о GridView (имеется в виду не WPF), то impromptu может проксировать расширение в poco с данным интерфейсом. Скажем, у нас есть список расширений, вы можете преобразовать их в poco:

IEnumerable<IMyInterface> listOfPocos
       = Impropmtu.AllActLike<IMyInterface>(listOfExpandos, typeof(INotifyPropertyChanged));
1 голос
/ 21 декабря 2013

Я пришел к этой теме после исследования той же темы, я не нашел решения, но построил свое собственное, так как я отчаянно нуждался в этом.Итак, вот мое решение без POCO, которое действительно работает.

// Fill "list" with your dynamic objects.

// cast a dynamic object to dictionary so we get the properties from it.
var props = list[0] as IDictionary<string, object>;

// create a datatable 
var table = new System.Data.DataTable();
    foreach (var c in props.Keys)
        table.Columns.Add(new DataColumn(c));

foreach (var o in list)
{
    var row = table.NewRow();
    var op =  o as IDictionary<string, object>;
    foreach (var p in op.Keys)
    {
        row[p] = op[p];
    }
    table.Rows.Add(row);
}

И просто привяжите эту таблицу к вашей сетке!

Я проверил это, и у меня это сработало.

1 голос
/ 11 апреля 2011

Хорошо, по-видимому, на данный момент вы просто не можете привязать элемент управления GridView к экземпляру ExpandoObject.Мне пришлось использовать отражение, чтобы преобразовать ExpandoObject в класс POCO.

0 голосов
/ 03 сентября 2015

адаптируясь от ответа Бена

 public static DataTable ToDataTable(this IEnumerable<dynamic> items)
    {
        if (!items.Any()) return null;

        var table = new DataTable();
        bool isFirst = true;

        items.Cast<IDictionary<string, object>>().ToList().ForEach(x =>
        {
            if (isFirst) 
              {
                x.Keys.Select(y => table.Columns.Add(y)).ToList();
                isFirst = false;
              }
            table.Rows.Add(x.Values.ToArray());
        });

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