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