将GridView绑定到Dynamic或ExpandoObject对象

时间:2011-04-06 22:44:31

标签: .net gridview dynamic orm expandoobject

我正在使用Rob Conery的Massive ORM,但我无法将生成的ExpandoObject绑定到GridView

我确实找到了另一个建议使用名为即兴的框架的Stackoverflow问题,但我不确定这是否适用于此。如果您知道,请提供代码示例以将ExpandoObject实际转换为GridView控件可绑定的内容。

最糟糕的情况是,是否有人为Massive实施了另一种方法(可以共享)以将生成的ExpandoObject转换为POCO?

非常感谢任何帮助。感谢。

7 个答案:

答案 0 :(得分:50)

由于无法绑定到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;
}

答案 1 :(得分:2)

如果我们正在谈论GridView(意思不是WPF),那么impromptu可以在给定接口的情况下将expando代理到poco。假设我们有一个expando列表,您可以将它们转换为poco:

IEnumerable<IMyInterface> listOfPocos
       = Impropmtu.AllActLike<IMyInterface>(listOfExpandos, typeof(INotifyPropertyChanged));

答案 2 :(得分:2)

我调整了布莱恩接受的答案,使其更加简洁和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扩展,我所使用的每个代码库都有这个扩展。)

答案 3 :(得分:1)

好的,显然截至目前,您无法将GridView控件绑定到ExpandoObject实例。我不得不使用反射将ExpandoObject转换为POCO类。

答案 4 :(得分:1)

在研究了相同的主题之后,我找到了这个帖子,我发现没有解决方案但是构建了我自己,因为我迫切需要这个。所以这是我的解决方案,没有真正有用的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);
}

只需将此表绑定到您的网格!

我测试了它,它对我有用。

答案 5 :(得分:0)

改编Ben的回答

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

答案 6 :(得分:0)

/// <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 pair in ((IDictionary<string, object>)data[0]))
    {
        dt.Columns.Add(pair.Key, pair.Value.GetType());
    }


    foreach (var d in data)
    {
        dt.Rows.Add(((IDictionary<string, object>)d).Values.ToArray());
    }
    return dt;
}