18

RobConeryのMassiveORMを使用していますが、結果ExpandoObjectをにバインドできませんでしたGridView

impromptuと呼ばれるフレームワークの使用を提案する別のStackoverflowの質問を見つけましたが、それがこれで機能するかどうかはわかりません。知っている場合は、コントロールがバインドできるExpandoObjectものに実際に変換するためのコードサンプルを提供してください。GridView

最悪のシナリオでは、Massiveが結果ExpandoObjectをPOCOに変換するための追加のメソッド(共有可能)を実装した人はいますか?

どんな助けでも大歓迎です。ありがとう。

4

7 に答える 7

52

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;
}
于 2011-06-09T20:14:12.167 に答える
2

GridView(WPFではないことを意味します)について話している場合、impromptuは、インターフェイスが指定されたpocoにexpandoをプロキシできますエキスパンドのリストがあり、それらをポコに変換できるとします。

IEnumerable<IMyInterface> listOfPocos
       = Impropmtu.AllActLike<IMyInterface>(listOfExpandos, typeof(INotifyPropertyChanged));
于 2011-06-20T13:48:59.417 に答える
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拡張機能を定義したことを前提としています)。

于 2013-06-05T22:00:56.030 に答える
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);
}

そして、このテーブルをグリッドにバインドするだけです!

私はそれをテストしました、そしてそれは私のために働きました。

于 2013-12-21T18:42:59.917 に答える
0

さて、明らかに今のところ、GridViewコントロールをExpandoObjectインスタンスにバインドすることはできません。ExpandoObjectをPOCOクラスに変換するには、リフレクションを使用する必要がありました。

于 2011-04-11T01:39:04.863 に答える
0

ベンの答えから適応

 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;
    }
于 2015-09-03T08:49:35.283 に答える
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;
}
于 2021-08-10T15:51:28.600 に答える