0

PIVOT 関数によって動的な数の列が作成されたデータの動的リストがあります。多かれ少なかれすべてが機能しますが、いくつかの列にカスタム書式を適用したかったのです。最初の行を取得して次のようにキャストするだけで、列のリストを取得する方法を見つけました。

var columns = Model.Comparisons.Select(x => x).FirstOrDefault() as IDictionary<string, object>;

次に、「列」をループしてリストを作成することにしました。これは、動的フィールド名で「format:」句の動的フィールドを直接参照する限り機能します。たとえば、次のようになります。

foreach (var c in columns)
{
    switch (c.Key)
    {
        case "Cost":
            cols.Add(grid.Column(
            columnName: c.Key,
            header: c.Key,
            format: (item) => Convert.ToDecimal(item.Cost).ToString("C")));
            break;
        default:
            cols.Add(grid.Column(columnName: c.Key, header: c.Key, format: item => item[c.Key]));
            break;
    }
}

「デフォルト」は、各レコードの値を動的に取得しません。「item[c.Key]」とitem.Costに関係していると思います。問題は、主にデータが変更される可能性があるため、事前にわからないため、フィールドごとに異なる大文字と小文字を記述する必要がないことです。常に存在する約 6 つのフィールドがあります。ただし、データ型は知っています。そのため、カスタム形式を適用したかったのです。

編集

私は拡張メソッドを書くことでこれを解決することができました。

public static class DynamicDataHelper
{
    public static WebGridColumn GetColumn(this HtmlHelper helper, string vendor)
    {
        return new WebGridColumn()
        {
            ColumnName = vendor,
            Header = vendor,
            Format = (item) => helper.ActionLink(
                (string)Convert.ToDecimal(item[vendor]).ToString("C"),
                "VendorSearch",
                "Compare",
                new { Vendor = vendor, mpn = item.MPN },
                new { target = "_blank" })
        };
    }
}
4

1 に答える 1

0

私が書いた Html ヘルパーを使用して投稿を編集しました。これは、問題があったカスタム WebGridColumn オブジェクトを実際に構築します。「ベンダー」はビューから渡され、実行時に解決されます。それはうまくいきます。

于 2012-07-17T21:32:04.477 に答える